次の方法で共有


読み取り/書き込みスピン ロック

Windows Vista Service Pack 1 (SP1) 以降では、リーダーとライターが共有するデータ構造への同期アクセスを、関連する一連のルーチンがスピン ロックを使用してサポートします。 データ構造への読み取りアクセスのみを必要とするスレッドは、スピン ロックを使用して、この構造体を他のリーダー スレッドと共有できます。 共有データ構造に書き込みをするスレッドは、書き込みの前に、スピン ロックを使用してデータ構造への排他アクセス権を取得する必要があります。

リーダー スレッドに共有アクセスのスピン ロックの取得が必要なときに、ライター スレッドの排他アクセス権のためにロックが既に保持済みの場合は、リーダーはまずライターがロックを解放するまで待機する必要があります。 同様に、ライター スレッドが排他的アクセスのためにスピン ロックを取得する必要があり、1 つ以上のリーダー スレッドによる共有アクセスに対してロックが保持済みの場合、ライター スレッドは、これらすべてのリーダー スレッドがロックを解放するまで待機する必要があります。 ライターが待機している間、新しいリーダー スレッドはロックを取得できません。 代わりに、ライターが待機しているロックを取得する必要があるリーダーは、まず、ライターがロックを取得して解放するまで待機する必要があります。

スレッドは、リーダーとライターの間でロールを切り替えることができます。 既に共有アクセスのスピン ロックを保持しているスレッドは、スピン ロックのアクセス モードを共有モードから排他モードに変換しようとします。 この試行は、共有アクセスのスピン ロックをまだ保持しているリーダーがいない場合や、排他的アクセスのスピン ロックの取得をまだ待機しているライターがない場合に成功します。

スピン ロックを再帰的に取得するとデッドロックが発生し、許可されません。

WINDOWS Vista SP1 以降のリーダー/ライター スピン ロックを管理するために使用できるルーチンの一覧を次に示します。

ルーチン名 説明
ExAcquireSpinLockExclusive 呼び出し元による排他的アクセスのスピン ロックを取得し、IRQL をDISPATCH_LEVEL に上げます。
ExAcquireSpinLockExclusiveAtDpcLevel IRQL >= DISPATCH_LEVEL で既に実行されている呼び出し元による排他的アクセスのスピン ロックを取得します。
ExAcquireSpinLockShared 呼び出し元による共有アクセスのスピン ロックを取得し、IRQL をDISPATCH_LEVEL に上げます。
ExAcquireSpinLockSharedAtDpcLevel IRQL >= DISPATCH_LEVEL で既に実行されている呼び出し元によ共有アクセスのスピン ロックを取得します。
ExReleaseSpinLockExclusive 呼び出し元が排他アクセスのために取得したスピン ロックを解放し、元の IRQL を復元します。
ExReleaseSpinLockExclusiveFromDpcLevel 呼び出し元が排他的アクセス用に取得したスピン ロックを解放します。IRQL は低下しません。
ExReleaseSpinLockShared 呼び出し元が共有アクセスのために取得したスピン ロックを解放し、元の IRQL を復元します。
ExReleaseSpinLockSharedFromDpcLevel 呼び出し元が共有アクセス用に取得したスピン ロックを解放します。IRQL は低下しません。
ExTryConvertSharedSpinLockExclusive 呼び出し元が共有アクセス用に既に保持しているスピン ロックのアクセス状態を排他アクセスに変換しようとします。

リーダー/ライター スピン ロック ルーチンはすべて、最初のパラメーターとして、スピン ロックへのポインターを受け取ります。これは 、EX_SPIN_LOCK 構造体です。 この構造体はドライバーに対して不透明です。 ドライバーは、非ページ システム メモリからスピン ロックの記憶域を割り当て、ロックをゼロに初期化する必要があります。