muduo網路庫學習之Timestamp類、AtomicIntegerT 類封裝中的知識點
一、Timestamp類封裝
class Timestamp :
public muduo::copyable,
public boost::less_than_comparable<Timestamp>
類圖如下:
public boost::less_than_comparable<Timestamp>
值語義:可以拷貝,拷貝之後,與原物件脫離關係
物件語義:要麼是不能拷貝;要麼可以拷貝,拷貝之後與原物件仍然存在一定的關係,比如共享底層資源
兩者之間的關係參見這裡。
1、muduo::copyable 空基類,標識類,值型別
2、less_than_comparable<Timestamp> 模板類
Timestamp 要求實現<, =,可自動實現>,<=,>=
3、成員 microSecondsSinceEpoch_ 是現在這個時刻距離1970-01-01 00:00:00 (UTC 時間) 的微秒數
4、BOOST_STATIC_ASSERT 編譯時斷言
assert 執行時斷言
5、使用PRld64
int64_t 用來表示64位整數,在32位系統中是long long int,在64位系統中是long int,所以列印int64_t的格式化方法是:
printf(“%ld”, value); // 64bit OS
printf("%lld", value); // 32bit OS
跨平臺的做法:
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#undef __STDC_FORMAT_MACROS
printf("%" PRId64 "\n", value);
printf(“%ld”, value); // 64bit OS
printf("%lld", value); // 32bit OS
跨平臺的做法:
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#undef __STDC_FORMAT_MACROS
printf("%" PRId64 "\n", value);
二、AtomicIntegerT 類封裝
template<typename T>
class AtomicIntegerT : boost::noncopyable
class AtomicIntegerT : boost::noncopyable
類圖如下:
1、為什麼需要原子性操作?
x++; (x是共享變數)
從記憶體中讀x的值到暫存器中,對暫存器加1,再把新值寫回x所處的記憶體地址
(1)、假設是多核(multiprocessors)的情況,x 的初始值為5:
因為每個核都有自己獨立的暫存器,兩個執行緒同時訪問可能出現只加了一次的情況。
(2)、假設是單核的情況:
例如有兩個執行緒,它們按照如下順序執行(注意讀x和寫回x是原子操作,兩個執行緒不能同時執行(偽併發),是分時實現):
time Thread 1 Thread 2
load eax, x
load eax, x
add eax, 1
add eax, 1
store x, eax
store x, eax
我們會發現最終x的值會是1而不是2,Thread 1的結果被覆蓋掉了,因為Thread2在進行++之前以為x還是0,而不是1(每個執行緒都儲存自己的上下文包括暫存器的值,重新排程回Thread2時eax被載入為原來儲存的0)。
這種情況下我們就需要對x++這樣的操作加鎖(例如Pthread中的mutex)以保證同步,或者使用一些提供了atomic operations的庫,linux下的如atomic.h,下面會介紹部分函式。
2、gcc 原子性操作
// 原子自增操作
type __sync_fetch_and_add (type *ptr, type value)
type __sync_fetch_and_add (type *ptr, type value)
type tmp = *ptr;
*ptr += value;
return tmp;
// 原子比較和設定操作
type __sync_val_compare_and_swap (type *ptr, type oldval, type newval)
// 原子比較和設定操作
type __sync_val_compare_and_swap (type *ptr, type oldval, type newval)
if (*ptr == oldval)
{
}*ptr = newvalreturn oldval;
else
return *ptr;
bool __sync_bool_compare_and_swap (type *ptr, type oldval, type newval)
if (*ptr == oldval)
{
}*ptr = newval;return true;
else
return false;
// 原子賦值操作
type __sync_lock_test_and_set (type *ptr, type value)
type tmp = *ptr;
*ptr = value;
return tmp;
使用這些原子性操作,編譯的時候需要加-march=cpu-type 或者 -march = native
3、volatile 關鍵字
volatile的作用: 作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值。簡單地說就是防止編譯器對程式碼進行優化。當要求使用volatile 宣告的變數的值的時候,系統總是重新從它所在的記憶體讀取資料,而不是使用儲存在暫存器中的備份。即使它前面的指令剛剛從該處讀取過資料,而且讀取的資料立刻被儲存。
補充:gcc/g++ 一些編譯選項
-Wall // 大部分警告
-Wextra // 一些額外的警告
-Werror // 當出現警告時轉為錯誤,停止編譯。(對應 -Wno-error)
-Wconversion // 一些可能改變值的隱式轉換,給出警告。
-Wno-unused-parameter // 函式中出現未使用的引數,不給出警告。
-Wold-style-cast // C風格的轉換,給出警告
-Woverloaded-virtual // 如果函式的宣告隱藏住了基類的虛擬函式,就給出警告。
-Wpointer-arith // 對函式指標或者void *型別的指標進行算術操作時給出警告
-Wshadow // 當一個區域性變數遮蓋住了另一個區域性變數,或者全域性變數時,給出警告。
-Wextra // 一些額外的警告
-Werror // 當出現警告時轉為錯誤,停止編譯。(對應 -Wno-error)
-Wconversion // 一些可能改變值的隱式轉換,給出警告。
-Wno-unused-parameter // 函式中出現未使用的引數,不給出警告。
-Wold-style-cast // C風格的轉換,給出警告
-Woverloaded-virtual // 如果函式的宣告隱藏住了基類的虛擬函式,就給出警告。
-Wpointer-arith // 對函式指標或者void *型別的指標進行算術操作時給出警告
-Wshadow // 當一個區域性變數遮蓋住了另一個區域性變數,或者全域性變數時,給出警告。
-Wwrite-strings // 規定字串常量的型別是const char[length],因此,把這樣的地址複製給 non-const char *指標將產生警告.
這些警告能夠幫助你在編譯期間發現企圖寫入字串常量 的程式碼
-march=native // 指定cpu體系結構為本地平臺
相關文章
- muduo網路庫學習之MutexLock類、MutexLockGuard類、Condition類、CountDownLatch類封裝中的知識點MutexCountDownLatch封裝
- muduo網路庫學習之BlockinngQueue類、ThreadPool 類、Singleton類封裝中的知識點BloCthread封裝
- muduo網路庫學習之ThreadLocal 類、ThreadLocalSingleton類封裝知識點thread封裝
- muduo網路庫學習之Logger類、LogStream類、LogFile類封裝中的知識點封裝
- muduo網路庫學習之Exception類、Thread 類封裝中的知識點(重點講pthread_atfork())Exceptionthread封裝
- muduo網路庫Timestamp類
- muduo網路庫AtomicIntegerT原子整數類
- muduo網路庫學習筆記(1):Timestamp類筆記
- muduo網路庫學習筆記(8):高效日誌類的封裝筆記封裝
- muduo網路庫學習之muduo_http 庫涉及到的類HTTP
- muduo網路庫學習之muduo_inspect 庫涉及到的類
- muduo網路庫學習之EventLoop(四):EventLoopThread 類、EventLoopThreadPool 類OOPthread
- muduo網路庫學習筆記(3):Thread類筆記thread
- muduo網路庫Exception異常類Exception
- muduo網路庫學習筆記(12):TcpServer和TcpConnection類筆記TCPServer
- muduo網路庫學習之EventLoop(一):事件迴圈類圖簡介和muduo 定時器TimeQueueOOP事件定時器
- muduo網路庫學習筆記(6):單例類(執行緒安全的)筆記單例執行緒
- 13封裝網路請求類庫封裝
- muduo網路庫學習之EventLoop(七):TcpClient、ConnectorOOPTCPclient
- Java中類的一些知識點Java
- Laravel 小知識點之 HtmlString 類LaravelHTML
- muduo網路庫編譯安裝編譯
- JavaSE基礎知識學習-----Object類JavaObject
- java學習 -- 利用類的反射和泛型自己動手寫jdbc封裝小類庫Java反射泛型JDBC封裝
- muduo網路庫學習筆記(2):原子性操作筆記
- 學習網路安全能掌握哪些知識點?網路安全技術學習
- muduo網路庫學習之EventLoop(六):TcpConnection::send()、shutdown()、handleRead()、handleWrite()OOPTCP
- 【入門知識】網路安全中的漏洞分為哪幾類?
- muduo網路庫學習筆記(11):有用的runInLoop()函式筆記OOP函式
- jquery學習之重要知識點jQuery
- muduo網路庫學習筆記(14):chargen服務示例筆記
- Java學習--Java 中的包裝類Java
- C++中類相關知識點總結C++
- muduo網路庫學習筆記(13):TcpConnection生命期的管理筆記TCP
- muduo網路庫學習筆記(10):定時器的實現筆記定時器
- java學習之基本包裝類Java
- JavaSE基礎知識學習—–抽象類和介面Java抽象
- JavaSE基礎知識學習-----抽象類和介面Java抽象