C++ 名前付き要件: SharedMutex (C++17 以降)
From cppreference.com
SharedMutex 要件は、Mutex 要件を拡張して、共有ロック所有モードを含みます。
[編集] 要件
さらに、SharedMutex 型のオブジェクト m は、別の所有モードである共有モードをサポートします。複数のスレッド(より一般的には、実行エージェント)が同時にこのミューテックスを共有モードで所有できますが、排他モードで所有しているスレッドがある場合、どのスレッドも共有所有権を取得することはできません。また、共有モードで所有しているスレッドがある場合、どのスレッドも排他所有権を取得することはできません。実装定義された数(10000 未満ではない)を超えるスレッドが共有ロックを保持している場合、共有モードでのミューテックスの取得の試みは、共有所有者の数がそのしきい値を下回るまでブロックされます。
- 式
m.lock_shared()は、以下のプロパティを持ちます。
- アトミック操作として振る舞います。
- ミューテックスの共有所有権を取得できるまで、呼び出しスレッドをブロックします。
- このミューテックスに対する以前の
m.unlock()操作は、このロック操作と *同期* します(リリース・アキュア std::memory_order と同等)。 - 呼び出しスレッドがすでに任意のモードでミューテックスを所有している場合、動作は未定義です。
- 例外がスローされた場合、共有ロックは取得されません。
- 式
m.try_lock_shared()は、以下のプロパティを持ちます。
- アトミック操作として振る舞います。
- 呼び出しスレッドのミューテックスの共有所有権を、ブロックせずに取得しようとします。所有権が取得されなかった場合、直ちに返します。この関数は、ミューテックスが現在どのスレッドにもどのモードでも所有されていない場合でも、偶発的に失敗して返ることが許可されています。
try_lock_shared()が成功した場合、同じオブジェクトに対する以前のunlock()操作は、この操作と *同期* します(リリース・アキュア std::memory_order と同等)。- 呼び出しスレッドがすでに任意のモードでミューテックスを所有している場合、動作は未定義です。
- 式
m.unlock_shared()は、以下のプロパティを持ちます。
- アトミック操作として振る舞います。
- 呼び出しスレッドのミューテックスの所有権を解放し、同じオブジェクトに対する後続の成功したロック操作と *同期* します。
- 呼び出しスレッドがミューテックスを所有していない場合、動作は未定義です。
- 単一のミューテックスに対するすべてのロックおよびアンロック操作は、単一の総順序で発生します。
[編集] 標準ライブラリ
以下の標準ライブラリ型は、SharedMutex 要件を満たします。
| (C++17) |
共有相互排他機能を提供する (クラス) |
| (C++14) |
共有相互排他機能を提供し、タイムアウト付きのロックを実装する (クラス) |