C++ 多線程架構 (2):Mutex 互斥和 Sem 訊號量

來源:互聯網
上載者:User
互斥和訊號量是多線程編程的兩個基礎,其原理就不詳細說了,大家去看看作業系統的書或者網上查查吧。

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

初始化互斥鎖

鎖操作

解鎖操作

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

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 訊號量的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.