Boost併發程式設計之shared mutex

2021-08-04 04:18:45 字數 1413 閱讀 6618

shared_mutex即讀寫鎖,不同與我們常用的獨佔式鎖mutex,shared_mutex是共享與獨佔共存的鎖,實現了讀寫鎖的機制,即多個讀執行緒乙個寫執行緒,通常用於對於乙個共享區域的讀操作比較頻繁,而寫操作比較少的情況。

讀寫鎖比起mutex具有更高的適用性,具有更高的並行性,可以有多個執行緒同時占用讀模式的讀寫鎖,但是只能有乙個執行緒占用寫模式的讀寫鎖,讀寫鎖的基本規則可以總結為「寫優先,讀共享,交叉互斥「,具體表現為讀寫鎖的三種狀態:

(1)當讀寫鎖是寫加鎖狀態時,在這個鎖被解鎖之前,所有試圖對這個鎖加鎖的執行緒都會被阻塞。(交叉互斥)

(2)當讀寫鎖在讀加鎖狀態時,所有試圖以讀模式對它進行加鎖的執行緒都可以得到訪問權,但是以寫模式對它進行加鎖的執行緒將會被阻塞。(讀共享,交叉互斥)

(3)當讀寫鎖在讀模式的鎖狀態時,如果有另外的執行緒試圖以寫模式加鎖,讀寫鎖通常會阻塞隨後的讀模式鎖的請求,這樣可以避免讀模式鎖長期占用,而等待的寫模式鎖請求則長期阻塞。(寫優先)

注:其實在讀者-寫者問題中,有讀者優先和寫者優先兩種模式,只是在boost中的shared_mutex預設的實現是寫者優先,這其實也是有道理的,因為在我們總是希望讀到的資料是最新的,這就得保證寫者優先。

下面通過乙個 boost::shared_mutex的應用例項來反應其鎖機制,該例子中我們建立兩個讀者執行緒,兩個寫者執行緒,程式的實際執行結果很直接的反應了shared_mutex應用情況。

#include #include #include using namespace boost;

int g_num = 10; //全域性變數,寫者改變該全域性變數,讀者讀該全域性變數

shared_mutex s_mu; //全域性shared_mutex物件

//寫執行緒

void read_(std::string &str)

boost::this_thread::sleep(boost::posix_time::seconds(1)); //讀執行緒離開後再slpp 1秒(改變這個值可以看到不一樣的效果) }}

//讀執行緒

void writer_(std::string &str)

boost::this_thread::sleep(boost::posix_time::seconds(2)); //寫執行緒離開後再slpp 2秒,這裡比讀執行緒多一秒是因為如果這裡也是1秒,那兩個寫執行緒一起請求鎖時會讓讀執行緒飢餓 }}

int main()

程式執行結果如下:

從執行結果中可以看出,如果是讀者獲得了shared_mutex,則其他讀者可以同時進入臨界區,但如果是寫者獲得了shared_mutex,則其他的寫者或讀者都不能進入臨界區,即同時只有乙個寫者能進入臨界區。

boost併發程式設計boost atomic

三個用於併發程式設計的元件 atomic,thread,asio 用於同步和非同步io操作 atomic,封裝了不同計算機硬體的底層操作原語,提供了跨平台的原子操作功能,解決併發競爭讀寫變數的困擾。包含標頭檔案,atomic可以把對型別t的操作原子化,t的要求 1.標量型別,算數,列舉,指標 2.只...

併發程式設計之併發佇列

jdk 中提供了一系列場景的併發安全佇列。總的來說,按照實現方式的不同可分為阻塞佇列和非阻塞佇列,前者使用鎖實現,而後者則使用cas 非阻塞演算法實現。1 非阻塞佇列 concurrentlinkedqueue concurrentlinkedqueue是無界非阻塞佇列,內部使用單項鍊表實現 其中有...

boost併發程式設計 多執行緒

原子操作,基本都包含我們三個方面所關心的語義 操作本身是不可分割的 atomicity 乙個執行緒對某個資料的操作何時對另外乙個執行緒可見 visibility 執行的順序是否可以被重排 ordering include include include using namespace std usi...