この mutex とロックのインターフェイスは、ハイパフォーマンス向けに設計された単純なものです。インターフェイスは、次の理由により、C++ ライブラリーで広く使用されているスコープ・ロック・パターン を使用します。
パターンには、mutex とロック の 2 つの部分があります。ロック・オブジェクトのコンストラクターはロックを取得し、ロック・オブジェクトのデストラクターはロックを解放します。次に例を示します。
{ // myLock を構築して myMutex のロックを取得 M::scoped_lock myLock( myMutex ); // ... ロック中に実行する処理 ... // myLock を破棄して myMutex のロックを解放 }
ロック中の処理が例外をスローすると、ロックは自動的に解放され、ブロックは終了します。
次の表は、mutex 型 M の Mutex コンセプトの要件を示しています。
擬似署名 |
意味 |
---|---|
M() |
ロックしていない mutex を構築します。 |
~M() |
ロックしていない mutex を破棄します。 |
typename M::scoped_lock |
対応するスコープロックの種類。 |
M::scoped_lock() |
mutex を取得しないでロックを構築します。 |
M::scoped_lock(M&) |
ロックを構築して mutex のロックを取得します。 |
M::~scoped_lock() |
ロックを解放します (取得している場合)。 |
M::scoped_lock::acquire(M&) |
mutex のロックを取得します。 |
bool M::scoped_lock::try_acquire(M&) |
mutex のロックを取得しようとします。ロックが取得された場合は true、その他の場合は false を返します。 |
M::scoped_lock::release() |
ロックを解放します。 |
static const bool M::is_rw_mutex |
mutx がリーダー/ライター mutex の場合は true。その他の場合は false。 |
static const bool M::is_recursive_mutex |
mutx が再帰 mutex の場合は true。その他の場合は false。 |
static const bool M::is_fair_mutex |
mutx がフェアの場合は true。その他の場合は false。 |
mutex 型および M::scoped_lock 型は、コピーおよび移動できません。
次の表は、Mutex コンセプトをモデル化するクラスを要約したものです。
|
スケーラブル |
フェア |
リエントラント |
長い待機 |
サイズ |
---|---|---|---|---|---|
mutex |
OS 依存 |
OS 依存 |
× |
ブロック |
3 ワード以上 |
recursive_mutex |
OS 依存 |
OS 依存 |
○ |
ブロック |
3 ワード以上 |
spin_mutex |
× |
× |
× |
イールド |
1 バイト |
speculative_spin_mutex |
HW 依存 |
× |
× |
イールド |
2 キャッシュライン |
queuing_mutex |
○ |
○ |
× |
イールド |
1 ワード |
spin_rw_mutex |
× |
× |
× |
イールド |
1 ワード |
speculative_spin_rw_mutex |
HW 依存 |
× |
× |
イールド |
3 キャッシュライン |
queuing_rw_mutex |
○ |
○ |
× |
イールド |
1 ワード |
null_mutex |
- |
○ |
○ |
- |
空 |
null_rw_mutex |
- |
○ |
○ |
- |
空 |
null mutex の特徴と動作の説明は、『インテル® TBB デベロッパー・ガイド』を参照してください。
mutex、recursive_mutex、spin_mutex、spin_rw_mutex クラスは、次の表で説明されているように、C++11 インターフェイスをサポートしています。
擬似署名 |
意味 |
---|---|
void M::lock() |
ロックを取得します。 |
bool M::try_lock() |
mutex のロックを取得しようとします。ロックが取得された場合は true、その他の場合は false を返します。 |
void M::unlock() |
ロックを解放します。 |
class lock_guard<M> |
「C++11 の同期」セクションを参照してください。 |
class unique_lock<M> |
mutex クラスと再帰 mutex クラスには、次の表で説明されているように、基本的な OS ハンドルにアクセスするための C++11 の表現方法も用意されています。
ネイティブ・ハンドル・インターフェイス (M は mutex または recursive_mutex)。
擬似署名 |
意味 |
---|---|
M::native_handle_type |
ネイティブハンドル型。 Windows® オペレーティング・システムでは、LPCRITICAL_SECTION がネイティブハンドル型です。 ほかのオペレーティング・システムでは、(pthread_mutex*) がネイティブハンドル型です。 |
native_handle_type M::native_handle() |
mutex M のネイティブハンドルを取得します。 |
C++11 用の拡張として、spin_rw_mutex クラスには、リーダーロックを取得する操作に対応する read_lock() および try_read_lock() メソッドも用意されています。