C++ 名前付き要件: TimedMutex (C++11 以降)
From cppreference.com
TimedMutex 要件は、TimedLockable 要件を拡張して、スレッド間同期を含みます。
目次 |
[編集] 要件
TimedMutex 型のオブジェクト m について、さらに
- 式 m.try_lock_for(duration) は以下のプロパティを持ちます。
- アトミック操作として振る舞います。
durationで指定された時間内に、ミューテックスの排他所有権を取得しようと試みます。durationがduration.zero()以下の場合、ブロックせずに所有権を取得しようと試みます(try_lock()の場合と同様)。それ以外の場合、この関数はミューテックスが取得されるか、durationで指定された時間が経過するまでブロックします。取得に成功した場合のみduration内に返しますが、durationのある時点で他のスレッドによって所有されていなかったとしても、ミューテックスの取得に失敗することが許容されます。いずれの場合も、ミューテックスが取得された場合は true を返し、そうでない場合は false を返します。try_lock_for(duration)が成功した場合、同じオブジェクトに対する以前のunlock()操作は、この操作と *同期* します(release-acquire std::memory_order と同等)。- 呼び出し元のスレッドが既にミューテックスを所有している場合、動作は未定義です(
mが std::recursive_timed_mutex である場合を除く)。 - 実行中に、クロック、時間点、または期間によって例外がスローされる可能性があります(標準ライブラリによって提供されるクロック、時間点、および期間は決して例外をスローしません)。
- 式 m.try_lock_until(time_point) は以下のプロパティを持ちます。
- アトミック操作として振る舞います。
time_pointまでの残りの時間内に、ミューテックスの排他所有権を取得しようと試みます。time_pointが既に経過している場合、ブロックせずに所有権を取得しようと試みます(try_lock()の場合と同様)。それ以外の場合、この関数はミューテックスが取得されるか、time_pointで指定された時間が経過するまでブロックします。取得に成功した場合のみtime_pointより前に返しますが、time_pointより前のある時点で他のスレッドによって所有されていなかったとしても、ミューテックスの取得に失敗することが許容されます。いずれの場合も、ミューテックスが取得された場合は true を返し、そうでない場合は false を返します。try_lock_until(time_point)が成功した場合、同じオブジェクトに対する以前のunlock()操作は、この操作と *同期* します(release-acquire std::memory_order と同等)。- 呼び出し元のスレッドが既にミューテックスを所有している場合、動作は未定義です(
mが std::recursive_timed_mutex である場合を除く)。 - 実行中に、クロック、時間点、または期間によって例外がスローされる可能性があります(標準ライブラリによって提供されるクロック、時間点、および期間は決して例外をスローしません)。
[編集] 標準ライブラリ
以下の標準ライブラリ型は、 TimedMutex 要件を満たします。
| (C++11) |
再帰的にロックできる相互排他機能を提供する 同じスレッドによって、タイムアウト付きのロックを実装 (クラス) |
| (C++14) |
共有相互排他機能を提供し、タイムアウト付きのロックを実装する (クラス) |
| (C++11) |
タイムアウト付きのロックを実装した相互排他機能を提供する (クラス) |
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 2093 | C++11 | タイムアウト関連の例外が仕様に欠けていました。 | 言及 |