std::recursive_mutex
From 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のユースケースの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) |
基本的な相互排他機能を提供する (クラス) |