ライター優先のキューをベースにした、ローカルのみでスピンするリーダーライターロックです。 ロックはライターに先入れ先出し (FIFO: First In First Out) アクセスを許可し、ライターに連続的な負荷がかかる状況ではリーダーが処理を実行できなくします。
構文
class reader_writer_lock;
メンバー
パブリック クラス
| 名前 | 説明 |
|---|---|
| reader_writer_lock::scoped_lock クラス | ライターとして reader_writer_lock ロック オブジェクトを取得するために使用できる例外セーフ RAII ラッパー。 |
| reader_writer_lock::scoped_lock_read クラス | リーダーとして reader_writer_lock ロック オブジェクトを取得する際に使用できる、例外的に安全な RAII ラッパー。 |
パブリック コンストラクター
| 名前 | 説明 |
|---|---|
| リーダー_ライター_ロック | 新しい reader_writer_lock オブジェクトを構築します。 |
| ~reader_writer_lock デストラクター |
reader_writer_lock オブジェクトを破棄します。 |
パブリック メソッド
| 名前 | 説明 |
|---|---|
| ロック | リーダー/ライター ロックをライターとして取得します。 |
| lock_read | 読み手としてリーダー・ライター ロックを取得します。 ライターがいる場合、アクティブなリーダーは書き終わるまで待つ必要があります。 リーダーは単に、ロックを関心対象として登録し、ライターがロックを解放するまで待機します。 |
| try_lock | ブロックせずに、リーダー/ライター ロックをライターとして取得しようとします。 |
| try_lock_read | ブロックせずに、読み取り-書き込みロックを読取り側として取得しようとします。 |
| 解除 | 誰がロックしたかに応じて、リーダーまたはライターのリーダー・ライターロックを解除します。 |
解説
詳細については、「同期データ構造」をご覧ください。
継承階層
reader_writer_lock
要件
ヘッダー: concrt.h
名前空間: concurrency
ロックする
リーダー/ライター ロックをライターとして取得します。
void lock();
解説
多くの場合、scoped_lock コンストラクトを使用して、ライターとして例外セーフな方法で reader_writer_lock オブジェクトを取得および解放する方が安全です。
書き手がロックを取得しようとした後、書き手がロックを正常に取得して解放するまで、以降のリーダーはブロックされます。 このロックはライターに偏り、ライターの継続的な負荷の下でリーダーを使い果たす可能性があります。
ライターはリンクされており、ロックを解除するライターは次のライターを解放します。
呼び出し元コンテキストによってロックが既に保持されている場合、improper_lock 例外がスローされます。
読み取りロック
読み手としてリーダー・ライター ロックを取得します。 ライターがいる場合、アクティブなリーダーは書き終わるまで待つ必要があります。 リーダーは単に、ロックを関心対象として登録し、ライターがロックを解放するまで待機します。
void lock_read();
解説
多くの場合、scoped_lock_read コンストラクトを使用して、リーダーとして例外セーフな方法で reader_writer_lock オブジェクトを取得および解放する方が安全です。
ロックを待機している書き手がいる場合、読み手は、待機列のすべての書き手がロックを取得して解除するまで待機します。 このロックはライターに偏り、ライターの継続的な負荷の下でリーダーを使い果たす可能性があります。
リーダーライターロック
新しい reader_writer_lock オブジェクトを構築します。
reader_writer_lock();
読み取り/書き込みロック
reader_writer_lock オブジェクトを破棄します。
~reader_writer_lock();
解説
デストラクターが実行されたときに、ロックが保持されていないことが求められます。 ロックを保持したままリーダー/ライター ロックを破棄できるようにすると、未定義の動作が発生します。
reader_writer_lock::scoped_lock クラス
ライターとして reader_writer_lock ロック オブジェクトを取得するために使用できる例外セーフ RAII ラッパー。
class scoped_lock;
scoped_lock::scoped_lock
scoped_lock オブジェクトを構築し、reader_writer_lock パラメーターで渡された _Reader_writer_lock オブジェクトをライターとして取得します。 ロックが別のスレッドによって保持されている場合、この呼び出しはブロックされます。
explicit _CRTIMP scoped_lock(reader_writer_lock& _Reader_writer_lock);
パラメーター
リーダーライターロック
ライターとして取得する reader_writer_lock オブジェクト。
scoped_lock::~scoped_lock
reader_writer_lock オブジェクトを破棄し、そのコンストラクターで提供されたロックを解放します。
~scoped_lock();
reader_writer_lock::scoped_lock_read クラス
リーダーとして reader_writer_lock ロック オブジェクトを取得する際に使用できる、例外的に安全な RAII ラッパー。
class scoped_lock_read;
scoped_lock_read::scoped_lock_read
scoped_lock_read オブジェクトを構築し、reader_writer_lock パラメーターで渡された _Reader_writer_lock オブジェクトをリーダーとして取得します。 ロックが別のスレッドによってライターとして保持されている場合、または保留中のライターがある場合、この呼び出しはブロックされます。
explicit _CRTIMP scoped_lock_read(reader_writer_lock& _Reader_writer_lock);
パラメーター
_リーダーライターロック
読み取りに用いる reader_writer_lock オブジェクト。
reader_writer_lock::scoped_lock_read::~scoped_lock_read デストラクター
scoped_lock_read オブジェクトを破棄し、そのコンストラクターで提供されたロックを解放します。
~scoped_lock_read();
トライロック
ブロックせずに、リーダー/ライター ロックをライターとして取得しようとします。
構文
bool try_lock();
戻り値
ロックが取得された場合は値 true、それ以外の場合は値 false。
トライロックリード
ブロックせずに、読み取り-書き込みロックを読取り側として取得しようとします。
bool try_lock_read();
戻り値
ロックが取得された場合は値 true、それ以外の場合は値 false。
ロックの解除
誰がロックしたかに応じて、リーダーまたはライターのリーダー・ライターロックを解除します。
void unlock();
解説
ロックを待機しているライターがある場合、ロックの解放は常に FIFO 順で次のライターに移動します。 このロックはライターに偏り、ライターの継続的な負荷の下でリーダーを使い果たす可能性があります。