Mutex コンセプト

この mutex とロックのインターフェイスは、ハイパフォーマンス向けに設計された単純なものです。インターフェイスは、次の理由により、C++ ライブラリーで広く使用されているスコープ・ロック・パターン を使用します。

  1. プログラマーがロックを解放することを覚えておく必要がありません。
  2. ロックで保護されている排他制御領域から例外がスローされた場合、ロックを解放します。

パターンには、mutexロック の 2 つの部分があります。ロック・オブジェクトのコンストラクターはロックを取得し、ロック・オブジェクトのデストラクターはロックを解放します。次に例を示します。

{
    // myLock を構築して myMutex のロックを取得 
    M::scoped_lock myLock( myMutex );
    // ... ロック中に実行する処理 ...
    // myLock を破棄して myMutex のロックを解放
}

ロック中の処理が例外をスローすると、ロックは自動的に解放され、ブロックは終了します。

次の表は、mutex 型 M の 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 型および M::scoped_lock 型は、コピーおよび移動できません。

次の表は、Mutex コンセプトをモデル化するクラスを要約したものです。

Mutex コンセプトをモデル化する 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 デベロッパー・ガイド』を参照してください。

C++11 との互換性

mutex、recursive_mutex、spin_mutexspin_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() メソッドも用意されています。

関連情報