互斥和信號量是多執行緒程式設計的兩個基礎,其原理就不詳細說了,大家去看看作業系統的書或網路上查查吧。
對於互斥的實現,無論什麼作業系統都離不開三個步驟
初始化互斥鎖
鎖操作
解鎖操作
對於不同的系統只是實現的函數有一些不同而已,但是功能其實都大同小異,在鎖操作和解鎖操作的時候大部分系統都有超時機制在裡面,來保證不會一直鎖在某個地方,我們為了框架簡單,沒有設置超時,進行鎖操作的時候如果得不到鎖,將一直等待在那裡。
Mutex的基類我們描述如下
class CMutex { public: CMutex(const char *pName = NULL); //初始化锁 ~CMutex(); virtual bool Lock()=0; //锁操作,纯虚函数 virtual bool UnLock()=0; //解锁操作,纯虚函数 const char * getName(void) const { return mutex_name; } protected: char *mutex_name; //锁名字 };
對於每個系統的實現,都需要完成初始化,鎖操作,解鎖操作三個部分,在linux下,這三個操作都很簡單,就不在這裡貼程式碼了。
同樣,對於信號量Sem,每個系統的實現也大同小異,無非就是
初始化信號量
發送信號量(信號量+1)
接收信號量(信號量-1)
Sem基類描述如下
class CCountingSem { public: typedef enum { kTimeout, kForever }Mode; CCountingSem(); //初始化信号量 ~CCountingSem(); virtual bool Get() = 0; //接收信号量 virtual bool Post(void) = 0; //发送信号量 };
class COperatingSystemFactory { public: static COperatingSystem *newOperatingSystem(); static CCountingSem *newCountingSem(unsigned int init=0); //参数是信号量的初始值,一般为0 static CMutex *newMutex(const char *pName=NULL); };
以上就是C++ 多執行緒框架(2):Mutex 互斥與Sem 信號量的內容PH,更多相關關係中文網(www.php.cn)!