首頁  >  文章  >  後端開發  >  C++ 多執行緒框架 (2):Mutex 互斥與 Sem 訊號量

C++ 多執行緒框架 (2):Mutex 互斥與 Sem 訊號量

黄舟
黄舟原創
2017-02-06 13:55:571651瀏覽

互斥和信號量是多執行緒程式設計的兩個基礎,其原理就不詳細說了,大家去看看作業系統的書或網路上查查吧。

對於互斥的實現,無論什麼作業系統都離不開三個步驟

初始化互斥鎖

鎖操作

解鎖操作

對於不同的系統只是實現的函數有一些不同而已,但是功能其實都大同小異,在鎖操作和解鎖操作的時候大部分系統都有超時機制在裡面,來保證不會一直鎖在某個地方,我們為了框架簡單,沒有設置超時,進行鎖操作的時候如果得不到鎖,將一直等待在那裡。

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;   //发送信号量 
 };

同樣,具體實作就不貼程式碼了。


當然,對於一個滿足設計模式的系統,新建互斥鎖和信號量的時候當然不能直接new這些類啦,必然還要通過簡單工程來返回,在COperatingSystemFactory類中添加newMutex和newCountingSem方法,透過COperatingSystemFactory對作業系統的判斷來傳回對應的實體。

class COperatingSystemFactory  
{  
    public:  
        static COperatingSystem *newOperatingSystem();  
        static CCountingSem  *newCountingSem(unsigned int init=0); //参数是信号量的初始值,一般为0  
        static CMutex   *newMutex(const char *pName=NULL); 
 };

好了,有了互斥和信號量,怎麼用呢,在main函數中,我們可以先申請好互斥鎖和信號量,如果我們啟了很多線程,如果某幾個之間需要互斥鎖,那我們將申請好的互斥鎖賦值給對應的線程,就可以直接使用了。至於各個線程類,是你自己寫的,只是繼承自CThread而已,裡面的成員變量怎麼和main中申請的互斥鎖關聯,這就不用說了吧,你把它設置成public賦值也行,設置從private用函數set也行,一切看你啦。


有了互斥鎖和信號量,下面就可以起消息隊列了,有了消息隊列,一個最簡單的多線程模型也就完成了。


github位址:

https://github.com/wyh267/Cplusplus_Thread_Lib

以上就是C++ 多執行緒框架(2):Mutex 互斥與Sem


以上就是C++ 多執行緒框架(2):Mutex 互斥與Sem 信號量的內容PH,更多相關關係中文網(www.php.cn)!

🎜🎜🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn