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鎖住的**越少,執行越快,整個程式執行效率越高unique_lockabguard1(my_mutex1); //所有權問題把鎖頭鎖住的**多少稱為粒度,粒度一般用粗細進行表示
a)鎖住的**越少,這個粒度越細,執行效率越高
a)鎖住的**越多,這個粒度越粗,執行效率越低
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...