互斥量mutex
類物件,理解成一把鎖,多個執行緒嘗試用lock()成員函式來對其加鎖,只有乙個執行緒能夠鎖定成功
lock( ) 與unlock( )須成對存在,很容易出問題, 所以引入**std::lock_guard()**類模板,對於忘記新增unlock(),會自動新增,類似於智慧型指標的功能。
鎖住的**量多少成為粒度的粗細,粒度越細,**執行效率越高。
死鎖
至少有兩個互斥量(鎖頭)才會產生死鎖。避免方法:只要保證互斥量上鎖的順序一致就不會產生死鎖。
std::.lock()處理多個互斥量才派的上用場。【謹慎使用】
adopt_lock是乙個結構體物件,起乙個標記作用:表示互斥量已經lock(),不需要在std::lock_guardmguard(m_mutex1)
再次lock();
unique_lock可以完全取代lock_guard// 方法1:
m_mutex2.
lock()
;m_mutex1.
lock()
;//---------------
m_mutex2.
unlock()
;m_mutex1.
unlock()
;//-------------
m_mutex2.
lock()
;// 與前面上鎖順序一致
m_mutex1.
lock()
;//---------------
m_mutex2.
unlock()
;m_mutex1.
unlock()
;// 方法2:
std:
:lock_guard:mutex>
mguard1
(m_mutex1)
;std:
:lock_guard:mutex>
mguard2
(m_mutex2)
;//------------------------------
std:
:lock_guard:mutex>
mguard1
(m_mutex1)
;std:
:lock_guard:mutex>
mguard2
(m_mutex2)
;// 方法3:結合std::lock()和lock_guard(),使用adop_lock
std:
:lock
(m_mutex1, m_mutex2)
;std:
:lock_guard:mutex>
mguard1
(m_mutex1, std:
:adopt_lock)
;std:
:lock_guard:mutex>
mguard2
(m_mutex2, std:
:adopt_lock)
;// 後面無須再unlock();
工作中一般使用lock_guard
unique_lock比lock_guard靈活,記憶體占用多一點
第二個引數:
unique_lock的成員函式:std:
:unique_lock:mutex>
mguard
(m_mutex, std:
:defer_lock)
;
unique_lock所有權的傳遞:std::unique_lockmguard(m_mutex);
std::mutex* pt = mguard.release(); // 此時pt相當於m_mutex,解除關聯,有責任手動解鎖
//--------------------
pt->unlock();
std:
:unique_lock:mutex>
mguard1
(m_mutex)
;std:
:unique_lock:mutex>
mguard2
(std:
:move
(mguard1)
);
多執行緒 互斥鎖
include include include handle mutex null srwlock g lock 改變乙個變數的時候需要鎖定 int num 6400000 在讀期間,值一直在變化,沒有鎖定。dword winapi reada void p i 使用acquiresrwlocksh...
多執行緒 互斥鎖
package com.yys.thread created by yys on 2017 9 25.兩個執行緒執行 t1如果能拿到02物件則t1執行緒執行完畢 t2如果能拿到o1物件則t2執行緒執行完畢 現在兩個執行緒分別鎖定了對方需要的物件 造成執行緒死鎖 public class testde...
多執行緒 互斥鎖
使用reentrantlock類的lock和unlock方法進行同步通訊 使用reentrantlock類的newcondition方法可以獲取condition物件,需要等待的時候使用conditionde await方法,喚醒的時候用signal方法,不同的執行緒使用不同的condition,這...