Boost 不同Mutex的大體說明

2021-06-12 09:45:25 字數 1469 閱讀 7988

寫過多執行緒程式的人都知道,不能讓多個執行緒同時訪問共享的資源是至關重要的。假如乙個執行緒試圖改變共享資料的值,而另外乙個執行緒試圖去讀取該共享資料的值,結果將是未定義的。為了阻止這樣的事情發生,需要用到一些非凡的原始資料型別和操作。其中最重的乙個就是總所周知的mutex(「mutual exclusion」的縮寫。譯註:相互排斥的意思,經常被翻譯為「互斥體」)。mutex在同一時間只能答應乙個執行緒訪問共享資源。當乙個執行緒需要訪問共享資源時,它必須先「鎖住」mutex,假如任何其他執行緒已經鎖住了mutex,那麼本操作將會一直被阻塞,直到鎖住了mutex的執行緒解鎖,這就保證了共享資源,在同一時間,只有乙個執行緒可以訪問。

mutex的概念有幾個變種。boost.threads支援兩大型別的mutex:簡單mutex和遞迴mutex。乙個簡單的mutex只能被鎖住一次,假如同一執行緒試圖兩次鎖定mutex,將會產生死鎖。對於遞迴mutex,乙個執行緒可以多次鎖定乙個mutex,但必須以同樣的次數對mutex進行解鎖,否則其他執行緒將無法鎖定該mutex。

在上述兩大類mutex的基礎上,乙個執行緒如何鎖定乙個mutex也有些不同變化。乙個執行緒有3種可能方法來鎖定mutex:

1. 等待並試圖對mutex加鎖,直到沒有其他執行緒鎖定mutex;

2. 試圖對mutex加鎖,並立即返回,假如其他執行緒鎖定了mutex;

3. 等待並試圖對mutex加鎖,直到沒有其他執行緒鎖定mutex或者直到規定的時間已過。

看起來最好的mutex型別是遞迴的mutex了,因為上述3種加鎖的方式它都支援。不過,不同的加鎖方式有不同的消耗,因此對於特定的應用,boost.threads答應你挑選最有效率的mutex。為此,boost.threads提供了6中型別的mutex,效率由高到低排列:boost::mutex,boost::try_mutex,boost::timed_mutex,boost::recursive_mutex,boost::recursive_try_mutex和boost::recursive_timed_mutex。

假如乙個執行緒鎖定乙個mutex後,而沒有解鎖,就會發生死鎖,這也是最為常見的錯誤了,為此,boost.threads專門進行了設計,可不直接對mutex加鎖或者解鎖操作,以使這種錯誤不可能發生(或至少很難發生)。取而代之地,mutex類定義了內嵌的typedef來實現raii(resource acquisition in initialization,譯註:在初始化時資源獲得)[4]用以對乙個mutex進行加鎖或者解鎖,這就是所謂的scoped lock模式。要構建乙個這種型別的鎖,需要傳送乙個mutex引用,建構函式將鎖定mutex,析構函式將解鎖mutex。c++語言規範確保了析構函式總是會被呼叫,所以即使有異常丟擲,mutex也會被正確地解鎖。

這種模式確保了mutex的正確使用。不過必須清楚,儘管scoped lock模式保證了mutex被正確解鎖,但它不能保證在有異常丟擲的時候,所有共享資源任然處於有效的狀態,所以,就像進行單執行緒程式設計一樣,必須確保異常不會讓程式處於不一致的狀態。同時,鎖物件不能傳送給另外乙個執行緒,因為他們所維護的狀態不會受到此種用法的保護。

boost多執行緒之mutex與lock

mutex類主要有兩種 獨佔式與共享式的互斥量。獨佔式互斥量 mutex 獨佔式的互斥量,是最簡單最常用的一種互斥量型別 try mutex 它是mutex的同義詞,為了與相容以前的版本而提供 timed mutex 它也是獨佔式的互斥量,但提供超時鎖定功能 遞迴式互斥量 recursive mut...

集合答題大體的

list分為arraylist 順序儲存 可以重複 執行緒不安全 陣列方法儲存 linkedlsit 雙向鍊錶方式儲存 可以重複 執行緒不安全的 vator 順序儲存 可以重複 但是執行緒不安全的 set 分為 hashset 無順序 不可以重複 使用的是hashmap的方式進行儲存的 treese...

boost庫中 不同版本載入lib的方式

boost庫1.53以前的並不支援vs2013編譯,只有之後的可以。所以我們需要用2013編譯後的lib檔案替換我們需要的。boost並不需要我們手動載入lib,因為其在boost config auto link.hpp中按巨集進行了設定。vc11 define boost lib toolset...