Muduo之封裝Mutex和Condition

2021-08-15 09:42:18 字數 3071 閱讀 3291

必要的預備知識:

linux提供的進行同步原語解釋

raii(resource acquisition is initialization)是一種利用物件生命週期來控制程式資源(如記憶體、檔案控制代碼、網路連線、互斥量等等)的簡單技術。

raii的一般做法:在物件構造時獲取資源(互斥量上鎖),接著控制對資源的訪問使之在物件的生命週期內始終保持有效,最後在物件析構的時候釋放資源(互斥量解鎖,剛好宣告週期和資源訪問週期等同)。藉此,我們實際上把管理乙份資源的責任託管給了乙個物件。使得不需要顯式地釋放資源並且物件所需的資源在其生命期內始終保持有效。以下封裝mutex採用了raii手法。

單件模式:保證乙個類僅有乙個示例,並提供乙個全域性訪問點。對一些類來說,只有乙個例項是很重要的。雖然系統中可以有許多印表機,但卻只應該有乙個列印假離線 (printer spooler ),只應該有乙個檔案系統和乙個視窗管理器。乙個全域性變數使得乙個物件可以被訪問,但它不能防止你例項化多個物件。乙個更好的辦法是,讓類自身負責儲存它的唯一例項。

實現要點:

1、避免構造、拷貝構造和賦值運算子。唯一例項化。

2、通過介面提供訪問點。全域性訪問節點。

mutexlock封裝linux底層pthread_mutex_t 實現臨界區,然後mutexlockguard通過raii手法封裝mutexlock。mutexlockguard封裝臨界區的進入和退出,一般將mutexlockguard建立與棧上,它的作用域剛好等於臨界區,避免的人為手動解鎖和姐解鎖,全部交給編譯器自動呼叫。

#include

#include

#include

#define mcheck(ret) ()//驗證系統呼叫返回值的巨集

class mutexlock : boost::noncopyable

~mutexlock()

bool islockedbythisthread()

void assertlocked()

void

lock()

void unlock()

pthread_mutex_t* getpthreadmutex()

private:

friend class condition;

class unassignguard : boost::noncopyable//私有類

~unassignguard()

mutexlock& owner_;

};void unassignholder()

void assignholder()

pthread_mutex_t mutex_;//互斥量,內部呼叫變數名加_

pid_t holder_;//儲存程序id

};class mutexlockguard : boost::noncopyable

~mutexlockguard()//析構釋放鎖

private:

mutexlock& mutex_;

};#define mutexlockguard(x) error "missing guard object name"

/*防止遺漏物件名,而產生臨時物件的錯誤。

mutexlockguard(mutex);//將構建臨時無名物件,構造之後立馬析構,生命週期很短,並沒有鎖住。只有含有物件名,其生命週期才和臨界區一樣。

*/

封裝條件變數

#include

#include

#include "mutex.h"

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_;

};#include "condition.h"

#include

// returns true if time out, false otherwise.

bool condition::waitforseconds(double seconds)

condition變數提供了比較原始的同步機制,實際上使用countdownlatch,來提供乙個通知,多個等待的模式。

class countdownlatch : boost::noncopyable

;

很基本的單件實現方法,需要介紹的就是通過pthread_once實現了多執行緒安全,這是有作業系統保證的。

template

class singleton : boost::noncopyable//避免拷貝和賦值

private:

singleton();//避免構造

~singleton();//避免析構,提供唯一例項

static

void init()

static

void destroy()

private:

static pthread_once_t ponce_;//靜態物件

static t* value_;//必須為靜態物件,保證此類僅僅擁有這乙份拷貝。滿足唯一例項

};template

pthread_once_t singleton::ponce_ = pthread_once_init;

template

t* singleton::value_ = null;

}

C 之封裝繼承和多型

c 中非常重要的概念,尤其是相對於c語言而言,也是其具有如此高的工程使用性的重要原因。封裝 所謂封裝是將某些東西隱藏起來,讓外界無法直接使用,而必須通過某些特定的方式才能訪問。也即是,將抽象得到的資料和行為 類似於屬性和方法 結合構成乙個有機整體,將資料與運算元據的函式構成類,其中資料和函式都是類的...

C 中 atomic和mutex的效率

由於 哪怕是對乙個bool型變數的賦值和讀取都不保證原子性 所以在併發環境下,操作可能產生data race的變數需要人為的加以保護。常用的措施 那麼這兩種措施效率如何呢?atomic形式 可以得出結論,atomic的形式的效率在臨界區操作不複雜的情況下,要比互斥量的效率高很多。include in...

c 學習之 封裝

封裝 封閉 讓你的隱私,屬於你個人 有乙個保護性的外殼或膜抱起來。1.封裝意味著保證類中的一些資料是私有的。使用封裝來控制對類的方法和字段的訪問。私有欄位和方法只能從類的內部訪問 乙個物件要想得到另乙個物件私有欄位中儲存的資料,只有乙個辦法,就是使用返回該資料的公共欄位和方法。相關問題 問 我需要通...