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 の要件をモデル化し、ロックを保証するライブラリー・クラスを要約したものです。
. |
フェア |
再帰 |
---|---|---|
|
いいえ |
いいえ |
|
いいえ |
いいえ |
|
いいえ |
いいえ |
|
はい |
いいえ |
|
はい |
はい |
注
上記の表で「いいえ」と示される文では、実装はそれに反した保証を持つことができます。
注
現在提供されているリーダー/ライター・ミューテック の戻り値は次のようになります。
is_recursive_mutex
がfalse
です。scoped_lock::downgrade_to_reader
は、常にtrue
を返します。
ただし、ReaderWriterMutex 要件の他の実装では、同じことを行う必要はありません。
参照: