ReaderWriterMutex

[req.rw_mutex]

ReaderWriterMutex の要件は、リーダーライター・ロックの概念を包括する形でミューテックスの要件を拡張します。この概念は、ライターロック (write = true) とリーダーロック (write = false) のどちらかを要求するか指定するブール・パラメーター write を導入しています。ライターロックがない場合、ReaderWriterMutex で複数のリーダーロックを同時に保持できます。ReaderWriterMutex のライターロックは、ほかのすべてのスレッドがミューテックスのロックを同時に保持するこを排除します。

class RWM { 
// Implementation specifics 
// ...// Represents acquisition of a mutex. 

class scoped_lock { 
public: 
    constexpr scoped_lock() noexcept; 
    scoped_lock(RWM& m, bool write = true); 
    ~scoped_lock(); scoped_lock(const scoped_lock&) = delete; 
    scoped_lock& operator=(const scoped_lock&) = delete; 
    void acquire(RWM& m, bool write = true); 
    bool try_acquire(RWM& m, bool write = true); 
    void release(); 
    bool upgrade_to_writer(); 
    bool downgrade_to_reader(); 
    }; 
};

RWM タイプは、次の要件を満たす場合に ReaderWriterMutex の要件を満たします。これはミューテックス要件の上位セットです。

type RWM::scoped_lock

スコープ付きロックのタイプに対応。

RWM::scoped_lock()

ミューテックスを取得しない scoped_lock を作成します。

RWM::scoped_lock(RWM&, bool write = true)

scoped_lock を作成して、指定されたミューテックスのロックを取得します。ロックは write が true の場合はライターロックで、それ例外はリーダーロックです。

RWM::~scoped_lock()

ロックを解放します (取得している場合)。

void RWM::scoped_lock::acquire(RWM&, bool write = true)

指定されたミューテックスのロックを取得します。ロックは write が true の場合はライターロックで、それ例外はリーダーロックです。

bool RWM::scoped_lock::try_acquire(RWM&, bool write = true)

指定されたミューテックスのロック取得を試みます。ロックは write が true の場合はライターロックで、それ例外はリーダーロックです。ロックが取得された場合は true、それ以外は false を返します。

RWM::scoped_lock::release()

ロックを解放します。ロックが保持されていない場合の結果は不定です。

bool RWM::scoped_lock::upgrade_to_writer()

リーダーロックをライターロックに変更します。ロックが解放または再取得された場合は false を返します。それ以外は、ロックがすでにライターロックである場合を含め true を返します。

bool RWM::scoped_lock::downgrade_to_reader()

ライターロックをリーダーロックに変更します。ロックが解放または再取得された場合は false を返します。それ以外は、ロックがすでにライターロックである場合を含め true を返します。

Mutex 要件と同様に、ReaderWriterMutex でも一連の特性を定義する必要があります。

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。

次の表は、ReaderWriterMutex の要件をモデル化し、ロックを保証するライブラリー・クラスを要約したものです。

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

.

フェア

再帰

rw_mutex

いいえ

いいえ

spin_rw_mutex

いいえ

いいえ

speculative_spin_rw_mutex

いいえ

いいえ

queuing_rw_mutex

はい

いいえ

null_rw_mutex

はい

はい

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

現在提供されているリーダー/ライター・ミューテック の戻り値は次のようになります。

  • is_recursive_mutexfalse です。

  • scoped_lock::downgrade_to_reader は、常に true を返します。

ただし、ReaderWriterMutex 要件の他の実装では、同じことを行う必要はありません。

参照: