C++ named requirements: Mutex (since C++11)
From cppreference.net
Mutex 要件は、 Lockable 要件を拡張し、スレッド間同期を含むようにします。
目次 |
要件
- Lockable
- DefaultConstructible
- Destructible
- コピー不可
- ムーブ不可
オブジェクト
m
が
Mutex
型の場合:
- The expression m. lock ( ) は以下の特性を持ちます
-
- アトミック操作として振る舞う。
- ミューテックスの排他的所有権が取得できるまで呼び出しスレッドをブロックする。
- 同一ミューテックスに対する事前の m. unlock ( ) 操作はこのロック操作と 同期する (release-acquire 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 この操作がデッドロックを引き起こすと実装が検出した場合。
- The expression m. try_lock ( ) は以下の特性を持ちます
-
- アトミック操作として振る舞う。
- 呼び出しスレッドのためのミューテックスの排他的所有権をブロックせずに取得しようとする。所有権が取得できない場合は直ちに返る。この関数は、ミューテックスが現在他のスレッドによって所有されていない場合でも、偽の失敗を起こして返ることが許されている。
-
try_lock()が成功した場合、同じオブジェクトに対する以前のunlock()操作はこの操作と同期する(リリース-アクquireのstd::memory_orderと同等)。lock()は失敗したtry_lock()とは同期しない。 - 例外を投げない。
- The expression m. unlock ( ) は以下の特性を持つ
-
- アトミック操作として振る舞う。
- 呼び出しスレッドのミューテックスの所有権を解放し、 synchronizes-with 同じオブジェクトに対する後続の成功したロック操作。
- 呼び出しスレッドがミューテックスを所有していない場合、動作は未定義である。
- 例外を送出しない。
- 単一のミューテックスに対するすべてのロックおよびアンロック操作は、 modification order として見なせる単一の全順序で発生します:この順序は個々のミューテックスに固有です。
標準ライブラリ
以下の標準ライブラリ型は Mutex 要件を満たします:
|
(C++11)
|
基本的な相互排他機能を提供する
(class) |
|
(C++11)
|
同じスレッドで再帰的にロック可能な相互排他機能を提供する
(class) |
|
(C++11)
|
同じスレッドで再帰的にロック可能で、
タイムアウト付きロックを実装する相互排他機能を提供する (class) |
|
(C++17)
|
共有相互排他機能を提供する
(class) |
|
(C++14)
|
共有相互排他機能を提供し、タイムアウト付きロックを実装する
(class) |
|
(C++11)
|
タイムアウト付きロックを実装する相互排他機能を提供する
(class) |
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 2309 | C++11 |
lock
は
std::system_error
をエラーコード std::errc::device_or_resource_busy でスローする可能性がある |
許可されない |