參考』www.cplusplus.com』
互斥量、互斥鎖,用於鎖住臨界區,防止多個執行緒同時處於臨界區中對臨界資源進行操作。
c++中的
mutex是乙個類,可建立可鎖物件。
mutex物件提供專屬所有權,且不支援遞迴。所謂專屬所有權是指,對已經被其他執行緒占有的mutex
物件,當前執行緒不能再進行鎖操作,否則會被阻塞。
constexpr
mutex()
noexcept
;mutex (
const mutex&)=
delete
;
mutex類只能使用預設建構函式,新構造的物件處於解鎖狀態(unlock)。
mutex類不支援拷貝建構函式、移動建構函式、賦值操作。
~
mutex()
;
使用析構函式銷毀mutex物件時,物件必須處於解鎖狀態(unlock),否則會造成未定義行為。
lock
函式鎖住mutex
,即上鎖。
lock
函式還有非成員函式版本,非成員函式lock
允許同時鎖住多個mutex
,避免了多個執行緒以不同的順序lock/unlock
單個mutex
物件時可能造成的死鎖。
顧名思義,嘗試上鎖,但不會阻塞該執行緒。若鎖已被其他執行緒獲得,則返回false
;否則,上鎖,返回true
。
同樣地,同乙個執行緒獲得該鎖後,又執行try_lock
操作,也會造成死鎖。
該函式有個缺點:可能造成虛假的上鎖失敗,即鎖未被其他執行緒獲得,但嘗試獲得鎖時還是失敗了。這個問題可以通過重複呼叫try_lock
解決。
void
unlock()
;
該函式用於解鎖mutex
物件,釋放所有權。解鎖後,其他被阻塞的執行緒將嘗試獲得鎖,這些阻塞執行緒中某乙個執行緒將獲得鎖並繼續執行。
如果mutex
沒有被鎖住,而執行緒仍呼叫unlock
去解鎖,將會造成未定義行為。
native_handle_type native_handle()
;
獲得原始控制代碼。該成員函式需要庫函式支援,且只存在於mutex
類中。
該函式可返回用於訪問與mutex
物件相關的具體實現資訊的值。
1、子執行緒和主線程交替列印一段資訊,重複5次。使用lock
和unlock
。
#include
#include
#include
std::mutex mt;
//預設建構函式,新構造的物件處於解鎖狀態
void
f(std::string str)
}int
main()
執行結果:
2、 使用try_lock
,驗證該函式未獲得鎖不會阻塞執行緒
#include
#include
#include
std::mutex mt;
//預設建構函式,新構造的物件處於解鎖狀態
void
f(std::string str)
//執行到這裡,說明子執行緒獲得了鎖
std::cout <<
"我 "
<< str <<
"終於獲得鎖!"
<< std::endl;
mt.unlock()
;//子執行緒釋放鎖
}int
main()
執行結果:
3、同乙個執行緒獲得鎖後,再上鎖,驗證不能讓同乙個執行緒連續兩次獲得同乙個鎖
#include
#include
#include
std::mutex mt;
//預設建構函式,新構造的物件處於解鎖狀態
intmain()
執行結果:
提示system_error
。
4、對未上鎖的mutex
物件執行unlock
操作,驗證不能對未上鎖的鎖進行解鎖操作
#include
#include
#include
std::mutex mt;
//預設建構函式,新構造的物件處於解鎖狀態
intmain()
執行結果:
輸出資訊後,提示
C 11多執行緒之mutex
mutex類是能用於保護共享資料免受從多個執行緒同時訪問的同步原語。mutex既不可複製亦不可移動。構造互斥。呼叫後互斥在未鎖定狀態。mutex 複製建構函式被刪除。mutex const mutex delete lock 鎖定互斥。若另一線程已鎖定互斥,則到lock的呼叫將阻塞執行,直至獲得鎖。...
多執行緒之Mutex 互斥量
include include include long g count 0 long g sum 0 static const int g s count 10 critical section g csthreadparamer critical section g csthreadcode h...
C 多執行緒 Mutex
dotnet 2010 05 29 19 07 24 閱讀151 字型大小 大 中小訂閱 互斥鎖 mutex 互斥鎖是乙個互斥的同步物件,意味著同一時間有且僅有乙個執行緒可以獲取它。互斥鎖可適用於乙個共享資源每次只能被乙個執行緒訪問的情況 函式 建立乙個處於未獲取狀態的互斥鎖 public mute...