boost庫在工作(18)執行緒之三

2021-06-16 15:01:11 字數 1253 閱讀 1869

前面的例子裡, 由於cout輸出並不是多執行緒安全的,如果多個執行緒同時輸出,可能導致死鎖的出現,因此在那個函式新增了乙個

boost::mutex

鎖,以便同步多個輸出的執行緒,這樣就不會造成死鎖了。在這個函式裡,還使用乙個類

boost::lock_guard

,這個類是乙個自動鎖的類,所謂的自動鎖,就是在建構函式裡呼叫上鎖函式,在析造函式裡呼叫解鎖函式,這樣在這個類

boost::lock_guard

宣告的物件的生命週期內,都可以防止別的執行緒來訪問鎖住的相關**。由於使用類

boost::lock_guard

,主要用在區域性作用域的情況下使用,這樣使用起來很方便,也很有效,不用擔心只加鎖,而不釋放的情況,就不會造成下次再訪問這個鎖時,不會死鎖。不過,使用

boost::mutex

鎖基本上都滿足大部份的情況,但有時由於乙個類的函式比較多,並很多函式裡共用乙個鎖時,再使用類

boost::lock_guard

時,就會在函式與函式之間呼叫,無意中就會造成遞迴呼叫的情況,這時,死鎖就會發生了。如下面的例子:

//#include "stdafx.h"

#include #include #include //全域性鎖。

boost::mutex g_mutexall;

//遞迴鎖會死鎖

void first(void)

void second(void)

//執行緒組執行的函式

void run(int nval)

int _tmain(int argc, _tchar* argv)

//等所有執行緒退出。

threadgroup.join_all();

system("pause");

return 0;

}在這個例子裡,由共用同乙個鎖

g_mutexall

,並且在第乙個函式裡新增了自動鎖,也在第二個函式裡新增自動鎖,同時再呼叫第乙個函式,結果在第二個函式就形成了遞迴呼叫的關係,導致死鎖發生,這種情況是開發人員要努力避免的,因為一旦出現就是悲慘世界,開發的軟體無論怎麼樣也運轉不了,往往就卡死在那裡,造成軟體不能操作,不幹活了,你的客戶怎麼會不生氣呢?也許你半夜裡,還給客戶的**叫醒過來,誰叫軟體業就是服務行業啊。因此在開發多執行緒軟體時,執行緒之間的同步,真正叫得上步步驚心、如履薄冰,不得不打上十二分的小心,這也是軟體開發過程裡困難之一。那麼面對這樣的困難,有沒有更方便的方法來解決呢?在

boost

庫里仔細找一下,還是有乙個鎖可以省心很多的。

boost庫在工作(19)執行緒之四

從前面也看到使用鎖boost mutex時,如果不小心就會死鎖,這樣要費心費力去維護這樣的 在boost庫里提供同乙個函式遞迴呼叫時使用的鎖boost recursive mutex,當同乙個執行緒呼叫時,碰到相同已經上鎖的鎖時,還可以繼續往下執行。這時就不用擔心同乙個執行緒呼叫不同的函式時造成死鎖...

boost庫在工作(20)執行緒之五

通過上面的學習,基本上就可以使用執行緒了,但怎麼樣讓執行緒執行類裡的成員函式呢?以便封裝得更方便使用了。接著下來,就看這個例子,如下 include stdafx.h include include include 封裝執行緒組執行的類,並且演示使用類成員函式作為執行緒組執行函式 class cth...

boost庫在工作(17)執行緒之二

前面的例子,還是過於簡單,只能學會使用乙個執行緒來呼叫乙個函式來執行。接著下來,我們提高一點要求,使用兩個或兩個以上的執行緒來執行同乙個函式。多個執行緒執行同乙個函式,其實就是執行緒池的概念,因為乙個執行緒只能在乙個cpu在裡執行,如果有四個cpu,那麼最高效率就是有八個執行緒執行,一般來說是cpu...