std::recursive_mutex
來自 cppreference.com
定義於標頭檔案 <mutex> |
||
class recursive_mutex; |
(C++11 起) | |
recursive_mutex
類是一個同步原語,可用於保護共享資料,使其不被多個執行緒同時訪問。
recursive_mutex
提供獨佔的、遞迴的所有權語義。
- 呼叫執行緒透過成功呼叫
lock
或try_lock
來獲得recursive_mutex
的所有權,並在之後的一段時間內保持該所有權。在此期間,該執行緒可以額外呼叫lock
或try_lock
。當執行緒呼叫匹配次數的unlock
時,所有權期結束。 - 當一個執行緒擁有一個
recursive_mutex
時,所有其他執行緒如果嘗試獲取recursive_mutex
的所有權,將會被阻塞(對於lock
呼叫)或收到 false 返回值(對於try_lock
)。 - 一個
recursive_mutex
可以被鎖定的最大次數是未指定的,但達到該次數後,呼叫lock
將丟擲 std::system_error,而呼叫try_lock
將返回 false。
如果一個 recursive_mutex
在仍被某個執行緒擁有時被銷燬,則程式的行為是未定義的。recursive_mutex
類滿足 Mutex 和 StandardLayoutType 的所有要求。
目錄 |
[編輯] 成員型別
成員型別 | 定義 |
native_handle_type (可選*) |
實現定義的 |
[編輯] 成員函式
構造互斥體 (public 成員函式) | |
銷燬互斥體 (public 成員函式) | |
operator= [已刪除] |
不可複製賦值 (public 成員函式) |
加鎖 | |
鎖定互斥體,如果互斥體不可用則阻塞 (public 成員函式) | |
嘗試鎖定互斥體,如果互斥體不可用則返回 (public 成員函式) | |
解鎖互斥體 (public 成員函式) | |
原生控制代碼 | |
返回底層實現定義的原生控制代碼物件 (public 成員函式) |
[編輯] 示例
recursive_mutex
的一個用例是保護一個類的共享狀態,該類的成員函式可能會相互呼叫。
執行此程式碼
#include <iostream> #include <mutex> #include <thread> class X { std::recursive_mutex m; std::string shared; public: void fun1() { std::lock_guard<std::recursive_mutex> lk(m); shared = "fun1"; std::cout << "in fun1, shared variable is now " << shared << '\n'; } void fun2() { std::lock_guard<std::recursive_mutex> lk(m); shared = "fun2"; std::cout << "in fun2, shared variable is now " << shared << '\n'; fun1(); // recursive lock becomes useful here std::cout << "back in fun2, shared variable is " << shared << '\n'; } }; int main() { X x; std::thread t1(&X::fun1, &x); std::thread t2(&X::fun2, &x); t1.join(); t2.join(); }
可能的輸出
in fun1, shared variable is now fun1 in fun2, shared variable is now fun2 in fun1, shared variable is now fun1 back in fun2, shared variable is fun1
[編輯] 參閱
(C++11) |
提供基本的互斥設施 (類) |