名前付き要件: Mutex
提供: cppreference.com
Mutex 要件はスレッド間の同期を含むように Lockable 要件を拡張します。
[編集] 要件
- Lockable
- DefaultConstructible
- Destructible
- コピー可能でない
- ムーブ可能でない
Mutex 型のオブジェクト m
について、
- 式 m.lock() が以下の性質を持ちます。
- アトミック操作として動作します。
- ミューテックスの排他所有権を取得できるまで呼び出し元スレッドをブロックします。
- 同じミューテックスに対する以前の m.unlock() 操作はこのロック操作に対して同期します (解放-取得の std::memory_order と同等です)。
- 呼び出し元スレッドがすでにそのミューテックスを所有している場合、動作は未定義です (ただし m が std::recursive_mutex または std::recursive_timed_mutex の場合を除きます)。
- エラーの場合は以下のエラーコードを持つ std::system_error 型の例外が投げられることがあります。
- 呼び出し元スレッドが必要な特権を持っていない場合 std::errc::operation_not_permitted
- この操作がデッドロックに繋がることを処理系が検出した場合 std::errc::resource_deadlock_would_occur
|
(C++17未満) |
- 式 m.try_lock() が以下の性質を持ちます。
- アトミック操作として動作します。
- 呼び出し元スレッドのためのミューテックスの排他所有権の取得をブロックせずに試みます。 所有権が取得されなかった場合、直ちに戻ります。 この関数は、ミューテックスが現在別のスレッドに所有されていなくても、 spurious に失敗して戻ることが許されています。
-
try_lock()
が成功した場合、同じオブジェクトに対する以前のunlock()
操作はこの操作に対して同期します (解放-取得の std::memory_order と同等です)。 失敗したtry_lock()
に対しては同期しません。 - 例外を投げません。
- 式 m.unlock() が以下の性質を持ちます。
- アトミック操作として動作します。
- 呼び出し元スレッドのミューテックスの所有権を解放し、同じオブジェクトに対する後続の成功したロック操作に対して同期します。
- 呼び出し元スレッドがミューテックスを所有していない場合、動作は未定義です。
- 例外を投げません。
- 単一のミューテックスに対するすべてのロック操作およびロック解除操作がアトミック変数の変更順序として見ることができる単一の全順序で発生します。 順序は個々のミューテックスに固有です。
[編集] ライブラリの型
以下の標準ライブラリの型は Mutex を満たします。