在知乎上有人吐槽說c++11多執行緒庫做的太複雜,建議自己封裝一蛤,只要乙個下午就搞定了。當然我沒有陳碩老師那麼大本事,花了幾天時間,學習了一下把posix pthread進行簡單的封裝。
互斥鎖主要用於互斥,互斥是一種競爭關係,用來保護臨界資源一次只被乙個執行緒訪問。
posix pthread提供下面函式用來操作互斥鎖。
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
//返回:
//pthread_mutex_init總是返回0
//其他mutex函式返回0表示成功,非0的錯誤碼表示失敗
由於pthread系列函式返回成功的時候都是0,因此,我們可以寫乙個巨集作為乙個輕量級的檢查手段,來判斷處理錯誤。
#define check(exp) \
if(!exp) \
實際使用的時候只需:
check(!pthread_mutex_lock(&mutex));
需要考慮以下幾個問題:
a.互斥鎖的初始化與銷毀。另外,我們的自己封裝的類不應該有賦值和拷貝構造的語義,這一點跟單例模式類似,我們可以使我們的類繼承自boost庫的noncopyable。b.互斥鎖的操作:加鎖和釋放鎖。
#ifndef __mutexlock_h__
#define __mutexlock_h__
#include
#include
#include
#include
#include
#define check(exp) \
if(!exp) \
class mutexlock : public boost::noncopyable
pthread_mutex_t *getmutexptr()
private:
void restoremutexstatus()
pthread_mutex_t mutex_;//互斥鎖
bool islocking_;
};#endif
這裡完成了thread 類的宣告,但是這裡還需要一些補充,那就是使用raii(資源獲取即初始化)
技術,對mutexlock初始化和析構進行處理:初始化的時候加鎖,析構的時候解鎖,這就需要我們重新定義乙個class mutexlockguard
對mutexlock
進行操作
class mutexlockguard:public boost::noncopyable
//構造時加鎖
~mutexlockguard()//析構時解鎖
private:
mutexlock &mutex_;
};
下面就要具體實現幾個函式了,主要是:
pthread_mutex_init()
、pthread_mutex_destroy()
、pthread_mutex_lock()
、pthread_mutex_unlock()
這四個函式的封裝:
#include "mutexlock.h"
mutexlock::mutexlock():islocking_(false)
mutexlock::~mutexlock()
void mutexlock::lock()
void mutexlock::unlock()
封裝以後,我們使用:
mutexlockgurad lock(mutex);
對臨界區進行加鎖,而只要我們控制好lock
變數的生存期,就能控制臨界區,例如:
int count=0;
//臨界區
//...
//離開lock的作用域,lock作為棧上變數,自動釋放,呼叫析構函式,同時釋放鎖。
1.
2.《linux多執行緒服務端程式設計—使用muduoc++ 網路庫》
C 封裝POSIX 執行緒庫(四)使用封裝的執行緒
本文主要介紹如何使用c 封裝posix 執行緒庫 一 互斥鎖 c 封裝posix 執行緒庫 二 條件變數的封裝和c 封裝posix 執行緒庫 三 執行緒的封裝三文中介紹的posix pthread的基本元件 互斥鎖,條件變數和執行緒 c 封裝的使用。設計乙個場景讓我們用到這三個元件 一共啟動三個執行...
posix執行緒庫《一》
posix執行緒庫的使用方法 1.與執行緒有關的函式構成了乙個完成的系列,絕大多數函式的名字有是以 pthread 開頭的 2.要使用這些函式庫,要通過引入 3.鏈結這些執行緒函式庫時要使用編譯器命令的 lpthread 執行緒和程序比較 程序執行緒 pid t pthread t fork pth...
Linux 執行緒 互斥鎖(一)
在程式設計中,引入了物件互斥鎖的概念,來保證共享資料操作的完整性。每個物件都對應於乙個可稱為 互斥鎖 的標記,這個標記用來保證在任一時刻,只能有乙個執行緒訪問該物件。表頭檔案 include 定義函式 int pthread mutex init pthread mutex t mutex,cons...