C++ 名前付き要件: Mutex (C++11 以降)
From 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 実装がこの操作によりデッドロックが発生すると検出した場合。
- 式 m.try_lock() は以下のプロパティを持ちます。
- アトミック操作として振る舞います。
- ブロックせずに、呼び出しスレッドのためにミューテックスの排他所有権を取得しようとします。所有権が取得されない場合、直ちに返します。ミューテックスが現在他のスレッドによって所有されていない場合でも、関数が誤って失敗して返ることが許可されています。
try_lock()が成功した場合、同じオブジェクトに対する以前のunlock()操作は、この操作と同期します (リリース-アサイン std::memory_order と同等)。lock()は、失敗したtry_lock()とは同期しません。- 例外をスローしません。
- 式 m.unlock() は以下のプロパティを持ちます。
- アトミック操作として振る舞います。
- 呼び出しスレッドのミューテックス所有権を解放し、同じオブジェクトに対する後続の成功したロック操作と同期します。
- 呼び出しスレッドがミューテックスを所有していない場合、動作は未定義です。
- 例外をスローしません。
- 単一のミューテックスに対するすべてのロックおよびアンロック操作は、単一の全順序で発生します。これは、アトミック変数の変更順序と見なすことができます。この順序は、この個々のミューテックスに固有のものです。
[編集] 標準ライブラリ
以下の標準ライブラリ型は、Mutex 要件を満たします。
| (C++11) |
基本的な相互排他機能を提供する (クラス) |
| (C++11) |
同じスレッドによって再帰的にロックできる相互排他機能を提供する (クラス) |
| (C++11) |
再帰的にロックできる相互排他機能を提供する 同じスレッドによって、タイムアウト付きのロックを実装 (クラス) |
| (C++17) |
共有相互排他機能を提供する (クラス) |
| (C++14) |
共有相互排他機能を提供し、タイムアウト付きのロックを実装する (クラス) |
| (C++11) |
タイムアウト付きのロックを実装した相互排他機能を提供する (クラス) |
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 2309 | C++11 | lock は std::system_error をスローする可能性があります。エラーコード std::errc::device_or_resource_busy を伴います。 |
許可されなくなった。 |