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 の要件をモデル化し、ロックを保証するライブラリー・クラスを要約したものです。

ミューテックスの要件をモデル化するミューテックスの保証を提供

.

フェア

再帰

mutex

いいえ

いいえ

spin_mutex

いいえ

いいえ

speculative_spin_mutex

いいえ

いいえ

queuing_mutex

はい

いいえ

null_mutex

はい

はい

上記の表で「いいえ」と示される文では、実装はそれに反した保証を持つことができます。

ミューテックス・プロパティーと、null ミューテックスの理論的根拠については、oneAPI スレッディング・ビルディング・ブロック・デベロッパー・ガイドを参照してください。

参照: