std:: recursive_mutex
From cppreference.net
C++
Concurrency support library
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
std::recursive_mutex
| Member functions | ||||
| Locking | ||||
| Native handle | ||||
|
ヘッダーで定義
<mutex>
|
||
|
class
recursive_mutex
;
|
(C++11以降) | |
recursive_mutex
クラスは、共有データが複数のスレッドから同時にアクセスされるのを防ぐために使用できる同期プリミティブです。
recursive_mutex
は排他的かつ再帰的所有権セマンティクスを提供します:
-
呼び出しスレッドは、
lockまたはtry_lockを正常に呼び出した時点から、recursive_mutexを 所有 する期間が開始します。この期間中、スレッドはlockまたはtry_lockへの追加呼び出しを行うことができます。所有期間は、スレッドがunlockを対応する回数だけ呼び出した時点で終了します。 -
スレッドが
recursive_mutexを所有している場合、他のすべてのスレッドは(lockの呼び出しに対して)ブロックされるか、または(try_lockに対して) false の戻り値を受け取ります(recursive_mutexの所有権を要求しようとした場合)。 -
recursive_mutexがロック可能な最大回数は未規定ですが、その回数に達した後は、lockの呼び出しは std::system_error をスローし、try_lockの呼び出しは false を返します。
スレッドによって所有されている状態で
recursive_mutex
が破棄された場合、プログラムの動作は未定義です。
recursive_mutex
クラスは
Mutex
および
StandardLayoutType
のすべての要件を満たします。
目次 |
メンバー型
| メンバー型 | 定義 |
native_handle_type
(
オプション*
)
|
実装定義 |
メンバー関数
|
ミューテックスを構築する
(public member function) |
|
|
ミューテックスを破棄する
(public member function) |
|
|
operator=
[deleted]
|
コピー代入不可
(public member function) |
ロック操作 |
|
|
ミューテックスをロックする。利用できない場合はブロックする
(public member function) |
|
|
ミューテックスのロックを試みる。利用できない場合は即座に返る
(public member function) |
|
|
ミューテックスをアンロックする
(public member function) |
|
ネイティブハンドル |
|
|
基盤となる実装定義のネイティブハンドルオブジェクトを返す
(public member function) |
|
例
recursive_mutex
の使用例の1つは、メンバー関数が互いに呼び出し合う可能性があるクラス内の共有状態を保護することです。
このコードを実行
#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)
|
基本的な相互排他機能を提供する
(class) |