c 多執行緒庫手冊學習筆記(二)

2021-10-02 06:38:54 字數 1792 閱讀 5337

三、mutex

1、基本mutex

定義在標頭檔案mutex中,std命名空間。

#include

基本mutex的用法非常普通,和pthread中無異,在c語言的程式設計中,對於mutex的lock和unlock是較為麻煩的,因為要關注正常退出和異常退出時,鎖的釋放,否則將容易造成死鎖,還有執行緒被cancel時候鎖的釋放。

在c++中聰明的利用了物件銷毀時自動析構的機制,採用了raii思想,對鎖進行了封裝管理,所以一般在使用c++的鎖時,應該是不建議直接對mutex物件進行操作的,而應該借助這些管理型別來操作。

2.基本的兩個鎖管理類:lock_guard, scoped_lock

該型別只能用於鎖定乙個鎖,一般用於某個函式只對乙個mutex管理下的資料進行修改訪問時使用:

//省略各種標頭檔案

std::mutex one_mutex;

int data=0;

void

modify_shared_data()

//guard的析構函式自動釋放鎖

intmain()

有時,需要在函式中間的地方短暫的釋放鎖,然後再重新獲取它,看似用lock_guard型別貌似無法實現,其實是可以的,手冊的例程給了很好的展示:

//省略各種標頭檔案

std::mutex one_mutex;

int data=0;

void

modify_shared_data

(int i)

//使用大括號分離定義域來達到目的

std::this_thread::

sleep_for

(2ms);}

intmain()

scope_lock和lock_guard所有特點基本相同,都只有建構函式和析構函式,不能複製不能移動(不能移動這個我感覺的,沒測試過),唯一不同的地方是,可以在構造時傳入多個鎖,並一起鎖定,由該型別的建構函式保證此處不死鎖。

題外話:如何避免死鎖

談到死鎖了,就想總結一下自己的理解,乙個鎖的時候只要不自己鎖自己一般都不會死鎖,但多個鎖要一起鎖定的時候,很容易發生死鎖,原因在於多個執行緒如果發生競爭,會發生每個執行緒都持有一把鎖,然後又要獲取其他人的鎖,變成a跟b說你把鎖給我,b說不行,你先把鎖給我的場景,最後就是誰也不能同時獲得兩個鎖,互相僵持。同時鎖定的鎖越多,這種競爭概率就越大。

但這種鎖競爭是可以有策略避免的,比如上面a和b兩個鎖,如果所有執行緒都約定如果要兩個鎖,那必須先搶a鎖再搶b鎖,這樣多個執行緒永遠都不會死鎖。這個思路的關鍵就在於約定乙個統一的順序,這樣大家不會產生每個人持有部分鎖的情況,死鎖就可以解決。

還有一種鎖叫層次鎖也是乙個原理,將鎖的獲取順序設計成單向線性的協議,就可以避免這種死鎖。當然實踐中還會有一些其他型別的死鎖,需要根據具體問題再分析。我猜這個scope_lock以及lock函式,來避免死鎖的演算法可能也是類似的,比如給每個mutex物件附帶乙個數字id,然後鎖的時候按id從小到大以此鎖定,嗯,瞎猜的。

但要注意lock_guard, scope_lock和unique_lock, shared_lock不是同級的關係,雖然功能上他們都是提供了析構函式自動釋放鎖的功能,但不是同級。

真要說起來:

lock_guard..

.//or

lock_guard>..

.//兩種都可以

C 多執行緒 學習筆記(二)

程序 基於程序的多工處理是程式的併發執行。執行緒 基於執行緒的多工處理是同一程式的片段的併發執行。c 多執行緒寫法,從入門開始,一點點往下寫,我也不知道能學到精通還是到放棄。根據主流的一些部落格技術文件,循序漸進,適於新手入門。首先第乙個程式是直接使用多執行緒建立函式建立多個執行緒。編譯的時候需要靜...

C 多執行緒學習筆記二

記憶體欄柵 variable var thread t1,t2 1 t1,t2 共享var public 有 鎖 的問題 2 t1,t2 各自有乙個var internal 沒有鎖爭用的問題 var slot thread.allocatedataslot username 主線程上設定槽位,也就是...

多執行緒學習筆記二

傳統執行緒 time 下午06 15 19 author retacn yue email zhenhuayue sina.com public class traditionalthread catch interruptedexception e system.out.println threa...