C++ named requirements: SharedMutex (since C++17)
From cppreference.net
C++
C++ named requirements
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SharedMutex 要件は、 Mutex 要件を拡張し、共有ロック所有権モードを含みます。
要件
さらに、
m
という
SharedMutex
型のオブジェクトは、別の所有モードである共有モードをサポートします。複数のスレッド(より一般的には実行エージェント)がこのミューテックスを共有モードで同時に所有できますが、排他モードで所有しているスレッドが存在する場合、いずれのスレッドも共有所有権を取得できず、共有モードで所有しているスレッドが存在する場合、いずれのスレッドも排他所有権を取得できません。実装定義の数(10000以上)を超えるスレッドが共有ロックを保持している場合、共有モードでミューテックスを取得する別の試みは、共有所有者の数がその閾値を下回るまでブロックされます。
- The expression m. lock_shared ( ) は以下の特性を持ちます:
-
- アトミック操作として振る舞う。
- ミューテックスの共有所有権が取得できるまで、呼び出しスレッドをブロックする。
- 同一ミューテックスに対する事前の m. unlock ( ) 操作は、このロック操作と 同期する (release-acquire std::memory_order と等価)。
- 呼び出しスレッドが既に何らかのモードでミューテックスを所有している場合、動作は未定義である。
- 例外がスローされた場合、共有ロックは取得されない。
- The expression m. try_lock_shared ( ) は以下の特性を持ちます:
-
- アトミック操作として振る舞う。
- 呼び出しスレッドがミューテックスの共有所有権をブロックせずに取得しようとする。所有権が取得できない場合は直ちに返る。この関数は、ミューテックスが現在どのスレッドにもどのモードでも所有されていない場合でも、偽の失敗を起こして返ることが許されている。
-
try_lock_shared()が成功した場合、同じオブジェクトに対する以前のunlock()操作はこの操作と同期する(release-acquireの std::memory_order と等価)。 - 呼び出しスレッドが既に何らかのモードでミューテックスを所有している場合、動作は未定義である。
- The expression m. unlock_shared ( ) は以下の特性を持ちます:
-
- アトミック操作として振る舞う。
- 呼び出しスレッドのミューテックス所有権を解放し、 synchronizes-with 同じオブジェクトに対する後続の成功するロック操作。
- 呼び出しスレッドがミューテックスを所有していない場合、動作は未定義である。
- 単一のミューテックスに対するすべてのロックおよびアンロック操作は、単一の全順序で発生します。
標準ライブラリ
以下の標準ライブラリ型は SharedMutex の要件を満たします:
|
(C++17)
|
共有相互排除機能を提供する
(クラス) |
|
(C++14)
|
共有相互排除機能を提供し、タイムアウト付きロックを実装する
(クラス) |