次の方法で共有


NdisAllocateRWLock 関数 (ndis.h)

NdisAllocateRWLock 関数は、NDIS_RW_LOCK_EX型の読み取り/書き込みロック変数を割り当てます。

構文

PNDIS_RW_LOCK_EX NdisAllocateRWLock(
  NDIS_HANDLE NdisHandle
);

パラメーター

NdisHandle

次のいずれかの関数から返されるハンドル。

NdisMRegisterMiniportDriver
ミニポートInitializeEx
NdisRegisterProtocolDriver
NdisOpenAdapterEx
NdisFRegisterFilterDriver
FilterAttach
Windows 8 および Windows Server 2012 以降: NDIS ハンドルが使用可能になる前に、DriverEntry で読み取り/書き込みロックが割り当てられている場合、呼び出し元はこのパラメーターに NULL 値を渡すことができます。

戻り値

NdisAllocateRWLock は、割り当て可能な場合は、NDIS_RW_LOCK_EX 構造体へのポインターを返します。それ以外の場合は、null 返します。

備考

NDIS ドライバーは、NdisAllocateRWLock 関数を呼び出して、ドライバー スレッド間で共有されるリソースへの読み取り/書き込みアクセスを制御する NDIS_RW_LOCK_EX 構造体を割り当てます。 ドライバーは、読み取り用に頻繁にアクセスされ、書き込みに頻繁にアクセスされるリソースに対して読み取り/書き込みロックを使用します。

ドライバーが割り当てる各ロックは、次のいずれかを実行できます。

  • IRQL <= DISPATCH_LEVEL で実行されるドライバー スレッドによる同時書き込みと読み取りアクセスから、個別の共有リソース セットを保護します。
  • IRQL <= DISPATCH_LEVEL で実行されるドライバー スレッドによる読み取りアクセスを同時に行うために、共有リソースの個別のセットを公開します。
NdisAllocateRWLock 返す NDIS_RW_LOCK_EX ポインターは、他のすべての読み取り/書き込みロック関数に必要なパラメーターです。

NDIS_RW_LOCK_EX は公平ではありません。 つまり、排他的アクセスのロックの取得を待機しているプロセッサは、読み取りアクセスのロックを保持しているプロセッサによって不足している可能性があります。 したがって、アクセスの大部分が書き込みアクセス用になる状況では、NDIS_RW_LOCK_EX を使用しないでください。 アクセスの大部分が書き込みアクセスを必要とする場合は、カーネル スピン ロックを使用する方が効率的です。 スピン ロックの詳細については、「スピン ロックの概要」を参照してください。

複数のプロセッサで読み取りアクセスの取得が多い状況では、通常、NDIS_RW_LOCK_EX はカーネル スピン ロックよりも優れたパフォーマンスを発揮します。 NDIS_RW_LOCK_EX は、複数のプロセッサに分散された 1 秒あたりに多数の読み取りアクセスが予想される場合に使用します。

NDIS_RW_LOCK_EX 構造体は、共有リソースへの書き込みアクセスを一度に 1 つの ISR 以外のドライバー スレッドに制限する属性を定義します。 NDIS_RW_LOCK_EX 構造体を使用すると、複数の ISR 以外のドライバー スレッドに、関連付けられているリソースへの同時読み取りアクセスを許可できます。 このような読み取りアクセスは、書き込みアクセス中は許可されません。

保護されたリソースを変更するには、ドライバー スレッドは、NdisAcquireRWLockWrite 関数を使用して書き込みロックを取得する必要があります。 これらのリソースを単に読み取るために、ドライバー スレッドは、NdisAcquireRWLockRead 関数を使用して読み取り専用ロックを取得する必要があります。 読み取りアクセスには、スピン ロックのインターロック操作や競合は必要ありません。 読み取り専用アクセスは、優れたオペレーティング システムとドライバーのパフォーマンスを維持するのに役立ちます。

リソース アクセスが完了すると、ドライバーは、NdisReleaseRWLock 関数を呼び出します。

ドライバーは、NdisFreeRWLock 関数を呼び出して、NdisAllocateRWLock 関数で割り当てられた NDIS_RW_LOCK_EX 構造体を解放する必要があります。

!ndiskd.ndisrwlock デバッガー拡張機能を使用して、NDIS_RW_LOCK_EXを検査したり、リーダーの数を確認したり、現在のライターが誰であるかを確認できます。 詳細については、「NDIS 拡張機能 (Ndiskd.dll)を参照してください。

必要条件

要件 価値
サポートされる最小クライアント NDIS 6.20 以降でサポートされています。
ターゲット プラットフォーム 万国
ヘッダー ndis.h (Ndis.h を含む)
ライブラリ Ndis.lib
IRQL <=DISPATCH_LEVEL

関連項目

FilterAttach

スピン ロック の概要

ミニポートInitializeEx

NDIS 拡張機能 (Ndiskd.dll)

NDIS_RW_LOCK_EX

NdisAcquireRWLockRead

NdisAcquireRWLockWrite

NdisFRegisterFilterDriver

NdisFreeRWLock

NdisMRegisterMiniportDriver

NdisOpenAdapterEx

NdisRegisterProtocolDriver

NdisReleaseRWLock