スリム リーダー/ライター (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) ロックの取得を試みます。 呼び出しが成功した場合、呼び出し元のスレッドはロックの所有権を取得します。 |