C 多執行緒程式設計之mutex

2021-10-08 22:53:26 字數 2697 閱讀 5643

參考』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次。使用lockunlock

#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...