Slim Reader/Writer (SRW) Locks (スリム リーダー/ライター (SRW) ロック)

スリム リーダー/ライター (SRW) ロックを使用すると、1 つのプロセスのスレッドが共有リソースにアクセスできます。彼らは速度のために最適化され、非常に少ないメモリを占有します。 スリムリーダーライターロックは、プロセス間で共有することはできません。

リーダー スレッドは共有リソースからデータを読み取りますが、ライター スレッドは共有リソースにデータを書き込みます。 共有リソースを使用して複数のスレッドが読み取りと書き込みを行っている場合、リーダー スレッドが継続的に実行されるが書き込み操作がまれな場合、クリティカル セクションやミューテックスなどの排他ロックがボトルネックになる可能性があります。

SRW ロックは、スレッドが共有リソースにアクセスできる 2 つのモードを提供します。

  • 共有モード。複数のリーダー スレッドへの共有読み取り専用アクセスを許可します。これにより、共有リソースから同時にデータを読み取ることができます。 読み取り操作が書き込み操作を超える場合、このコンカレンシーにより、重要なセクションと比較してパフォーマンスとスループットが向上します。

    注意

    共有モードの SRW ロックは、排他的な取得と組み合わせるとデッドロックが発生する可能性があるので、再帰的に取得しないでください。

  • 排他モード。一度に 1 つのライター スレッドへの読み取り/書き込みアクセスを許可します。 ロックが排他モードで取得された場合、ライターがロックを解放するまで、他のスレッドは共有リソースにアクセスできません。

    注意

    排他モード SRW ロックを再帰的に取得することはできません。 スレッドが既に保持しているロックを取得しようとすると、その試行は失敗します ( TryAcquireSRWLockExclusive の場合) またはデッドロック ( AcquireSRWLockExclusive の場合)

単一のSRWロックは、どちらのモードでも取得できます。リーダー スレッドは共有モードで取得できますが、ライター スレッドは排他モードで取得できます。 所有権を要求するスレッドに所有権が付与される順序に関する保証はありません。SRW ロックは公平でも FIFO でもありません。

SRW ロックはポインターのサイズです。 利点は、ロック状態を更新するのが速いということです。 欠点は、保存できる状態情報が非常に少ないため、SRW ロックは共有モードでの誤った再帰的な使用を検出しないことです。 さらに、共有モードで SRW ロックを所有するスレッドは、ロックの所有権を排他モードにアップグレードできません。

呼び出し元は、SRWLOCK 構造体を割り当て、 InitializeSRWLock (構造体を動的に初期化する) を呼び出すか、構造体変数に 定数SRWLOCK_INIT を割り当てる (構造体を静的に初期化する) 方法で初期化する必要があります。

アプリケーション検証ツールを使用して、SRW ロックの再帰的な (再入可能な) 使用を見つけることができます。

SRW ロック機能を次に示します。

SRW ロック機能 説明
AcquireSRWLockExclusive 排他モードで SRW ロックを取得します。
AcquireSRWLockShared 共有モードで SRW ロックを取得します。
InitializeSRWLock SRW ロックを初期化します。
ReleaseSRWLockExclusive 排他モードで開かれた SRW ロックを解放します。
ReleaseSRWLockShared 共有モードで開かれた SRW ロックを解放します。
SleepConditionVariableSRW 指定した条件変数をスリープ状態にし、指定したロックをアトミック操作として解放します。
TryAcquireSRWLockExclusive 排他モードでスリム リーダー/ライター (SRW) ロックの取得を試みます。 呼び出しが成功すると、呼び出し元のスレッドはロックの所有権を取得します。
TryAcquireSRWLockShared 共有モードでスリム リーダー/ライター (SRW) ロックの取得を試みます。 呼び出しが成功すると、呼び出し元のスレッドはロックの所有権を取得します。