Namespaces
Variants

C++ named requirements: SharedMutex (since C++17)

From cppreference.net
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 の要件を満たします:

共有相互排除機能を提供する
(クラス)
共有相互排除機能を提供し、タイムアウト付きロックを実装する
(クラス)

関連項目