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

吳YH堅發表於2016-09-19

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

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

1.初始化互斥鎖
2.鎖操作
3.解鎖操作

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

Mutex的基類我們描述如下

對於每個系統的實現,都需要完成初始化,鎖操作,解鎖操作三個部分,在linux下,這三個操作都很簡單,就不在這裡貼程式碼了。

同樣,對於訊號量Sem,每個系統的實現也大同小異,無非就是

1.初始化訊號量
2.傳送訊號量(訊號量+1)
3.接收訊號量(訊號量-1)

Sem基類描述如下

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

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

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

有了互斥鎖和訊號量,下面就可以起訊息佇列了,有了訊息佇列,一個最簡單的多執行緒模型也就完成了。

github地址:
https://github.com/wyh267/Cplusplus_Thread_Lib

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

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

相關文章