C 11多執行緒中關於unique lock的介紹

2021-10-25 04:15:24 字數 1881 閱讀 1454

unique_lock是個類模板,工作中,一般使用lock_guard;lock_guard取代了mutex的lock()和unlock()

unique_lock比lock_guard靈活很多,雖然效率上差一點,記憶體占用多一點

std::adopt_lock標記的效果就是「假設呼叫方執行緒已經擁有了互斥的所有權(已經lock()成功了)"

通知lock_guard不需要在建構函式中lock這個互斥量了;

用adopt_lock的前提是,你自己需要先把mutex先lock上

eg:

std::unique_lockabguard1(my_mutex1,std::adopt_lock);

此時如果需要呼叫這條語句,則需要提前加鎖,這條語句提供解鎖功能。

我們會嘗試用mutex的lock()去鎖定這個mutex,但如果沒有鎖定成功,我也會立即返回,並不會阻塞在那裡

用這個try_to_lock的前提是你自己不能先去lock

eg:

std::unique_lockabguard1(my_mutex1, std::try_to_lock);

即當有兩個執行緒時,如果乙個鎖住的時間較長,另乙個執行緒碰到這個鎖的時候,可以用if語句跳過這個鎖,往後面執行

用這個std::defer_lock的前提是,你不能自己先lock,否則會報異常

defer_lock的意思就是並沒有給mutex加鎖,初始了乙個沒有加鎖的mutex

使用std::defer_lock設定初始化的時候不進行預設的上鎖操作;從而在使用時可以隨時加鎖和解鎖,而且最後乙個鎖不用進行解鎖。

lock(),加鎖

unlock(),解鎖

try_lock(),嘗試去拿到鎖,返回true則拿到鎖

release(),返回它所管理的mutex物件指標,並釋放所有權,也就是說unique_lock和mutex不在有關係

嚴格區分unlock()和release()的區別

如果原來mutex物件處於加鎖狀態,則需要接管過來並且解鎖。(release返回的是原視my_mutex的指標)

eg:

std::unique_lockabguard1(my_mutex1);

此時ptr就是my_mutex1的指標

mutex *ptr=abguard1.release();  //現在需要自己解鎖my_mutex1

ptr->unlock();

注:

lock鎖住的**越少,執行越快,整個程式執行效率越高

把鎖頭鎖住的**多少稱為粒度,粒度一般用粗細進行表示

a)鎖住的**越少,這個粒度越細,執行效率越高

a)鎖住的**越多,這個粒度越粗,執行效率越低

unique_lockabguard1(my_mutex1); //所有權問題

abguard1可以把自己對mutex(my_mutex1)的所有權給其他unique_lock物件

使用move,但是只能轉移,不能複製

#include#include#include#include#includeusing namespace std;

class a

} }bool outmsglul(int &command)

return false;

} //把資料從訊息佇列中取出的執行緒

void outmsgrecvrueue()

else

}}private:

listmsgrecvqueue;

mutex my_mutex1; //建立乙個互斥量

};int main()

C 11中多執行緒

std lock guard是raii模板類的簡單實現,功能簡單。std lock guard 在建構函式中進行加鎖,析構函式中進行解鎖。鎖在多執行緒程式設計中,使用較多,因此c 11提供了lock guard模板類 在實際程式設計中,我們也可以根據自己的場景編寫resource guardraii...

C 11 多執行緒

新特性之描述 雖然 c 11 會在語言的定義上提供乙個記憶體模型以支援執行緒,但執行緒的使用主要將以 c 11 標準庫的方式呈現。c 11 標準庫會提供型別 thread std thread 若要執行乙個執行緒,可以建立乙個型別 thread 的實體,其初始引數為乙個函式物件,以及該函式物件所需要...

c 11 多執行緒

1.多執行緒的原理 同一時間內,cpu只能處理1條執行緒,只有1條執行緒在工作 執行 多執行緒併發 同時 執行,其實是cpu快速地在多條執行緒之間排程 切換 如果cpu排程執行緒的時間足夠快,就造成了多執行緒併發執行的假象。思考 如果執行緒非常非常多,會發生什麼情況?cpu會在n多執行緒之間排程,c...