この mutex とロックのインターフェイスは、ハイパフォーマンス向けに設計された単純なものです。 インターフェイスは、次の理由により、C++ ライブラリーで広く使用されているスコープ・ロック・パターン を使用します。
パターンには、mutex とロック の 2 つの部分があります。ロック・オブジェクトのコンストラクターはロックを取得し、ロック・オブジェクトのデストラクターはロックを解放します。 次に例を示します。
{
// myLock を構築して myMutex のロックを取得
M::scoped_lock myLock( myMutex );
... actions to be performed while holding the lock ...
// myLock を破棄して myMutex のロックを解放
}
ロック中の処理が例外をスローすると、ロックは自動的に解放され、ブロックは終了します。
次の表は、Mutex コンセプトの要件を示しています。
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 コンセプトをモデル化にするクラスを要約したものです。
Mutex コンセプトをモデル化にする mutex
|
|
スケーラブル |
フェア |
リエントラント |
長い待機 |
サイズ |
|---|---|---|---|---|---|
|
mutex |
OS 依存 |
OS 依存 |
× |
ブロック |
3 ワード以上 |
|
recursive_mutex |
OS 依存 |
OS 依存 |
○ |
ブロック |
3 ワード以上 |
|
spin_mutex |
× |
× |
× |
イールド |
1 バイト |
|
queuing_mutex |
✓ |
✓ |
× |
イールド |
1 ワード |
|
spin_rw_mutex |
× |
× |
× |
イールド |
1 ワード |
|
queuing_rw_mutex |
✓ |
✓ |
× |
イールド |
1 ワード |
|
null_mutex |
- |
○ |
○ |
- |
空 |
|
null_rw_mutex |
- |
○ |
○ |
- |
空 |
null mutex の特徴と動作の説明は、インテル® スレッディング・ビルディング・ブロック (インテル® TBB) の『入門チュートリアル』を参照してください。
mutex、recursive_mutex、spin_mutex、spin_rw_mutex クラスは、次の表で説明されているように、C++11 インターフェイスをサポートしています。
一部の 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() メソッドも用意されています。