Mutex
[req.mutex]
ミューテックスとロックのインターフェイスは、ハイパフォーマンス向けに設計された単純なものです。インターフェイスは、次の理由により、C++ ライブラリーで広く使用されているスコープ・ロック・パターン を使用します。
プログラマーがロックを解放することを認識する必要がありません。
ロックで保護されている排他制御領域から例外がスローされた場合、ロックを解放します。
パターンには、mutex とロック の 2 つの部分があります。Mutex オブジェクトのコンストラクターはロックを取得し、ロック・オブジェクトのデストラクターはロックを解放します。 次に例を示します:
{
// myLock を作成すると myMutex のロックが取得されます
M::scoped_lock myLock( myMutex );
// ... ロックを取得している間に実行されるアクション ...
// myLock を破棄すると myMutex のロックは解放されます
}
ロック中の処理が例外をスローすると、ロックは自動的に解放されてブロックは終了します。
class M {
// 実装の詳細
// ...
// Represents acquisition of a mutex
class scoped_lock {
public:
constexpr scoped_lock() noexcept;
scoped_lock(M& m);
~scoped_lock();
scoped_lock(const scoped_lock&) = delete;
scoped_lock& operator=(const scoped_lock&) = delete;
void acquire(M& m);
bool try_acquire(M& m);
void release();
};
};
M タイプは、次の要件を満たしている場合にミューテックスの要件を満たします:
- type M::scoped_lock
対応するスコープ付きロックのタイプ。
- M::scoped_lock()
mutex を取得しない
scoped_lock
を作成します。
- M::scoped_lock(M&)
scoped_lock
を作成して、指定されたミューテックスのロックを取得します。
- M::~scoped_lock()
ロックを解放します (取得している場合)。
- void M::scoped_lock::acquire(M&)
指定されミューテックスのロックを取得します。
- bool M::scoped_lock::try_acquire(M&)
指定されたミューテックスのロック取得を試みます。ロックが取得された場合は true。その他の場合は false を返します。
- void M::scoped_lock::release()
取得しているロックを解放します。
Mutex
タイプでは一連の特性を定義する必要があります:
- static constexpr bool M::is_rw_mutex
ミューテックスがリーダー/ライター・ミューテックスである場合は true、そ例外は false。
- static constexpr bool M::is_recursive_mutex
ミューテックスが再帰ミューテックスの場合は true、それ例外は false。
- static constexpr bool M::is_fair_mutex
ミューテックスがフェアの場合は true。その他の場合は false。
mutex タイプおよび M::scoped_lock
タイプは、コピーおよび移動できません。
次の表は、Mutex
の要件をモデル化し、ロックを保証するライブラリー・クラスを要約したものです。
. |
フェア |
再帰 |
---|---|---|
|
いいえ |
いいえ |
|
いいえ |
いいえ |
|
いいえ |
いいえ |
|
はい |
いいえ |
|
はい |
はい |
注
上記の表で「いいえ」と示される文では、実装はそれに反した保証を持つことができます。
ミューテックス・プロパティーと、null ミューテックスの理論的根拠については、oneAPI スレッディング・ビルディング・ブロック・デベロッパー・ガイドを参照してください。
参照: