次の方法で共有


NdisDprAcquireReadWriteLock 関数 (ndis.h)

NdisDprAcquireReadWriteLock 関数は、呼び出し元がドライバー スレッド間で共有されているリソースへの書き込みまたは読み取りアクセスに使用するロックを取得します。

メモ 読み取り/書き込みロック インターフェイスは、NDIS 6.20 以降のドライバーでは非推奨です。NdisAcquireRWLockRead または NdisAcquireRWLockWrite (Flags パラメーターに NDIS_RWL_AT_DISPATCH_LEVEL を設定する) 使用する必要 があります。
 

構文

void NdisDprAcquireReadWriteLock(
  [in, out] PNDIS_RW_LOCK Lock,
  [in]      BOOLEAN       fWrite,
  [out]     PLOCK_STATE   LockState
);

パラメーター

[in, out] Lock

ロックを表す不透明な変数へのポインター。 呼び出し元は、このロックを使用して共有リソースにアクセスできます。

[in] fWrite

ブール値。 値が TRUE の場合、この関数には共有リソースへの書き込みアクセスが提供されます。値が FALSE の場合、この関数には読み取りアクセスが提供されます。

[out] LockState

ロックの状態を追跡する不透明な変数へのポインター。 この変数は、呼び出し元がロックを取得して解放するまでの間隔に存在します。 呼び出し元は、同じ ISR 以外のドライバー スレッドからロックを取得しようとするたびに、LOCK_STATE 型の異なる変数を使用する必要があります。

戻り値

何一つ

備考

ドライバーは、次を使用して NDIS_RW_LOCK 型の変数を初期化する必要があります。ドライバーが他の NdisXxxReadWriteLock 関数を呼び出す前に、NdisInitializeReadWriteLock 関数を します。 ドライバーは、使用するロックの常駐ストレージを提供する必要があります。

NdisDprAcquireReadWriteLock 使用してロックを取得した後、呼び出し元は、NdisDprReleaseReadWriteLock 関数を呼び出すことによって、そのロックを解放する必要があります。 ロックの参照カウントを減らすには、ドライバーが呼び出す必要があります
NdisDprReleaseReadWriteLock NdisDprAcquireReadWriteLockへの呼び出しごとに 1 回

NdisDprAcquireReadWriteLock NdisDprAcquireReadWriteLock 両方を同じロックで使用しても安全です。 ただし、NdisDprAcquireReadWriteLock を使用してロック取得した場合は、NdisDprReleaseReadWriteLockを使用して解放されるように、呼び出しのバランスを取る必要があります。 同様に、NdisAcquireReadWriteLockでロックが取得された場合は、NdisReleaseReadWriteLock 解放する必要があります。

一部のアーキテクチャでは、NdisDprAcquireReadWriteLock は、NdisAcquireReadWriteLock よりも高速に実行されます。 ドライバーは、現在の IRQL が既に DISPATCH_LEVELされている場合、NdisAcquireReadWriteLock ではなく、NdisDprAcquireReadWriteLock を使用できます。 ただし、必須ではありません。 KeGetCurrentIrql 関数を呼び出すオーバーヘッドは、NdisAcquireReadWriteLock ではなく、NdisDprAcquireReadWriteLock呼び出すパフォーマンス上の利点よりも大きくなります。

ドライバー スレッド間で共有されるリソースを変更するには、ドライバー スレッドが書き込みロックを取得する必要があります。 これらのリソースを監視するには、ドライバー スレッドが読み取り専用ロックを取得する必要があります。 読み取りアクセスには、スピン ロックのインターロック操作や競合は必要ありません。 読み取り専用アクセスを使用すると、適切なオペレーティング システムとドライバーのパフォーマンスを維持するのに役立ちます。

ドライバー スレッドは、25 マイクロ秒を超える書き込みロックを保持しないでください。 書き込みロックを長期間保持すると、オペレーティング システムとドライバーの両方のパフォーマンスが低下します。

ドライバーは、読み取りまたは書き込みアクセスからリソースを保護するロックを使用できません。その他の関数は、ミニポートInterrupt やミニポートDisableInterruptEx 関数を します。 代わりに、ドライバー NdisMSynchronizeWithInterruptEx を呼び出す必要があります。 ミニポートSynchronizeInterrupt 関数は、同じ DIRQL にある共有リソースにアクセスします。
ミニポートインターラップ ミニポートDisableInterruptEx 関数が行います。

NDIS スピン ロックの取得と解放の詳細については、「ネットワーク ドライバー の同期と通知を参照してください。

必要条件

要件 価値
サポートされる最小クライアント NdisDprAcquireReadWriteLock の代わりに NdisAcquireRWLockRead または NdisAcquireRWLockWrite を使用する必要がある NDIS 6.20 以降のドライバーでは非推奨です。 NDIS 6.0 および 6.1 でサポートされます。
ターゲット プラットフォーム 万国
ヘッダー ndis.h (Ndis.h を含む)
ライブラリ Ndis.lib
IRQL = DISPATCH_LEVEL

関連項目

LOCK_STATE

ミニポートDisableInterruptEx

ミニポートInterrupt

ミニポート同期Interrupt

NdisAcquireRWLockRead

NdisAcquireRWLockWrite

NdisDprReleaseReadWriteLock

NdisInitializeReadWriteLock

NdisMSynchronizeWithInterruptEx