Mudoo網路庫中封裝的互斥量與條件變數

2021-07-13 11:07:13 字數 2663 閱讀 1549

mudoo網路庫中使用raii的方式封裝了同步原語,自己實現了互斥鎖和條件變數,這裡記錄一下方便自己理解。

其中最主要的幾個類有:mutexlock、mutexlockguard、condition以及countdownlatch。其中mutexlock和condtion是對於posix執行緒庫中的互斥鎖和條件變數的封裝,mutexlockguard和countdownlatch則是對他們的封裝。

mutexlock類的原始碼如下:

class

mutexlock : boost::noncopyable

~mutexlock

()

// must be called when locked, i.e. for assertion

bool islockedbythisthread() const

void assertlocked() const

// internal usage

void lock()

void unlock()

pthread_mutex_t* getpthreadmutex() /* non-const */

private:

friend class

condition;

class

unassignguard : boost::noncopyable

~unassignguard

()

private:

mutexlock& owner_;

};void unassignholder()

void assignholder()

pthread_mutex_t mutex_;

pid_t holder_;

};

建構函式:

mutexlock()

: holder_(0)

這個類有兩個資料成員mutex_為posix執行緒庫的互斥鎖變數, holder_表示當前鎖的持有者,建構函式不帶引數,乙個mutex類被初始化時先將互斥鎖初始化為預設的不可重入型,所有者holder_為0,表示沒有所有者持有。mchek是google-glog的乙個巨集,用於檢查返回值。因為assert在release版本中並沒有效果。

加鎖函式:

void lock()

加鎖函式將該類所擁有的互斥鎖加鎖,然後將所有者的執行緒號賦值為當前執行緒號。注意這個函式的加鎖和給holder_賦值的順序不能改變,只有已經獲得了互斥鎖才能確定當前執行緒為所有者。這個函式將在mutexlockguard的建構函式中被呼叫。

解鎖函式:

void unlock()

該函式先將所有者holder_設定為空然後再解鎖,注意這裡的順序依然不可以改變。這個函式將在mutexlockguard的析構函式中被呼叫。

下面是mutexlockguard類

class mutexlockguard : boost::noncopyable

~mutexlockguard()

private:

mutexlock& mutex_;

};

mutexlockguard類的私有資料成員為乙個mutexlock的引用,在其建構函式中通過初始化列表初始化該引用後,呼叫mutex_的成員函式lock()進行加鎖,在析構函式中呼叫unlock()對其進行解鎖。mutexlockguard應為乙個棧上物件,在生命週期結束時呼叫析構函式自動解鎖。乙個簡單的用法如下:

mutexlock mutex_;..

.//語句塊

lock的生命週期在大括號內,生命週期結束後會自動析構,析構函式呼叫mutexlock的unlock函式自動解鎖,因此不需要在手動的加鎖和解鎖,減少了出錯的概率。

condition類的源**如下

class condition : boost::noncopyable

~condition()

void wait()

// returns true if time out, false otherwise.

bool waitforseconds(double seconds);

void notify()

void notifyall()

private:

mutexlock& mutex_;

pthread_cond_t pcond_;

該類即對於條件變數的封裝,該類的資料成員為乙個mutexlock類和乙個條件變數,mudoo的作者陳碩老師認為乙個條件變數正常情況下是不會和不同的互斥鎖配合使用,因此這裡以乙個條件變數只能對應乙個互斥鎖(當然,乙個互斥鎖是可以對應多個條件變數的,例如使用條件變數解決生產者消費者問題的時候就經常如此)。

該類的建構函式接受乙個mutexlock類的引用作為引數初始化mutex_,並且初始化條件變數。而析構函式則釋放該條件變數。

wait()函式就是條件變數的,阻塞並等待對應的通知。先取消持有者的執行緒號然後呼叫pthread_cond_wait阻塞本執行緒並等待通知。

notify()和notifyall()分別封裝了發訊號通知某一給等待的條件變數和廣播通知所有的條件變數。

c 中封裝的介紹

封裝就是將物件執行所需要的資源封裝在程式物件中,並給外界公布介面,這樣很複雜的邏輯經過包裝之後給其他類使用就很方便,其他類不需要關心你裡邊的功能是以哪種方式實現的,只要傳入需要的引數就可以得到想要的結果。例如 我們要看電視,只需要按一下開關和換台就可以了,有必要了解電視機內部的結構嘛?製造商為了我們...

AFN 中 封裝網路請求原始碼示例

afn 一 模組 網路通訊模組 nsurlsession 網路狀態監聽模組 reachability 網路通訊安全模組 security 網路通訊序列化模組 serialization 對uikit框架擴充套件部分 uikit 以catagory形式新增特性 afnetworking的核心模組是通訊...

物件導向中 封裝的理解

封裝是保證軟體部件具有優良的模組性的基礎,封裝的目標就是要實現軟體部件的 高內聚 低耦合 防止程式相互依賴性而帶來的變動影響。在物件導向的程式語言中,物件是封裝 的最基本單位,物件導向的封裝比傳統語言的封裝更為清晰 更為有力。物件導向的封裝就 是把描述乙個物件的屬性和行為的 封裝在乙個 模組 中,也...