muduo庫學習筆記七 base庫之Mutex

2021-10-02 13:14:23 字數 1969 閱讀 2661

mutex互斥量:muduo庫中的封裝為mutexlock類與mutexlockguard類。

類圖:

繼承boost::noncopyable,物件語義不能拷貝,該類主要是對一系列系統執行緒函式pthread_mutex_***的封裝。

私有資料成員:

mutex_:儲存linux執行緒互斥量pthread_mutex_t

holder_:儲存擁有該鎖的執行緒的tid

公有成員函式:

islockedbythisthread:當前執行緒是否擁有該鎖

assertlocked:斷言當前執行緒鎖擁有該鎖

lock:加鎖

unlock:解鎖

getpthreadmutex:獲取執行緒互斥量指標

類圖:

mutexlockguard類使用raii技法封裝了mutexlock物件,方便使用者對互斥量的使用(建構函式中加鎖,析構函式中解鎖)

建構函式前的explict可以阻止不應該允許的經過轉換建構函式進行的隱式轉換的發生。宣告為explicit的建構函式不能在隱式轉換中使用。

例如:

還有乙個需要注意的是:mutexlockguard與mutexlock僅僅是關聯關係,沒有整體與區域性關係(有就是聚合),也不負責物件的生存期,如果存在整體與區域性關係並且負責物件生存期則是組合關係。

此外,為避免使用者錯誤使用,定義巨集:#define mutexlockguard(x) error "missing guard object name"

使用示例:

//#include #include #include #include #include #include #include #include using namespace muduo;

using namespace std;

mutexlock g_mutex;

vectorg_vec;

const int kcount = 10*1000*1000;

void threadfunc()

}int main()

printf("single thread without lock %f\n", timedifference(timestamp::now(), start));

start = timestamp::now();

threadfunc();

printf("single thread with lock %f\n", timedifference(timestamp::now(), start));

for (int nthreads = 1; nthreads < kmaxthreads; ++nthreads)

for (int i = 0; i < nthreads; ++i)

printf("%d thread(s) with lock %f\n", nthreads, timedifference(timestamp::now(), start));

}}

該例子主要再同樣操作情況下,比較單個執行緒不加鎖與加鎖的執行時間以及多個執行緒加鎖的執行時間。

對示例中的boost::ptr_vector進行說明:

指標容器: boost::ptr_vector

boost智慧型指標使用總結

muduo庫學習筆記 執行緒安全

muduo規定的必須在io執行緒完成的操作 連線的更新 連線的讀寫 連線的關閉 連線的析構等 tcpserver start 將acceptor listen置於所屬執行緒?一直不理解為什麼這裡需要將listen放到其所屬執行緒中 因為listen的描述符一定是在io執行緒中的 可能原因是其他從re...

muduo庫分析 base篇(4) Thread

執行緒管理物件,本身攜帶程序tid,需要執行的函式 標頭檔案 typedef boost functionthreadfunc 無引數無返回執行緒函式 explicit thread const threadfunc const string name string 別名防止拷貝函式 countdo...

muduo庫學習筆記三 cmake使用解析

在linux平台下使用cmake生成makefile並編譯的流程如下 a 編寫cmake配置檔案cmakelists.txt b 執行命令cmake path生成makefile,path是cmakelists.txt所在的目錄。c 使用make命令進行編譯。其中,a既是下文注釋的檔案,b c都由m...