C 封裝POSIX 執行緒庫(一)互斥鎖的封裝

2021-07-15 13:27:34 字數 2481 閱讀 6093

在知乎上有人吐槽說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.互斥鎖的初始化與銷毀。

b.互斥鎖的操作:加鎖和釋放鎖。

另外,我們的自己封裝的類不應該有賦值和拷貝構造的語義,這一點跟單例模式類似,我們可以使我們的類繼承自boost庫的noncopyable。

#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 mutexlockguardmutexlock進行操作

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...