NdisDprAcquireReadWriteLock 函数 (ndis.h)
NdisDprAcquireReadWriteLock 函数获取一个锁,调用方使用该锁对驱动程序线程之间共享的资源进行写入或读取访问。
语法
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 的变量驱动程序调用任何其他 Ndis Xxx ReadWriteLock 函数之前,NdisInitializeReadWriteLock 函数。 驱动程序必须为它使用的锁提供驻留存储。
使用 NdisDprAcquireReadWriteLock 获取锁后,调用方必须通过调用 NdisDprReleaseReadWriteLock 函数来释放该锁。 若要减少锁的引用计数,驱动程序必须调用
每次调用 NdisDprAcquireReadWriteLock 时, NdisDprReleaseReadWriteLock 一次。
可以安全地在同一锁上使用 NdisDprAcquireReadWriteLock 和 NdisDprAcquireReadWriteLock 。 但是,调用必须均衡,以便在使用 NdisDprAcquireReadWriteLock 获取锁时,必须使用 NdisDprReleaseReadWriteLock 释放该锁。 同样,如果使用 NdisAcquireReadWriteLock 获取锁,则必须使用 NdisReleaseReadWriteLock 释放该锁。
在某些体系结构中, NdisDprAcquireReadWriteLock 的执行速度比 NdisAcquireReadWriteLock 快。 如果确定当前 IRQL 已DISPATCH_LEVEL,驱动程序可以使用 NdisDprAcquireReadWriteLock 而不是 NdisAcquireReadWriteLock。 但是,这不是必需的。 调用 KeGetCurrentIrql 函数的开销大于调用 NdisDprAcquireReadWriteLock 而不是 NdisAcquireReadWriteLock 的性能优势。
若要修改在驱动程序线程之间共享的资源,驱动程序线程必须获取写入锁。 若要仅监视这些资源,驱动程序线程必须获取只读锁。 读取访问权限不需要互锁操作或旋转锁争用。 使用只读访问有助于保持良好的操作系统和驱动程序性能。
驱动程序线程的写入锁定不应超过 25 微秒。 长时间保留写入锁会降低操作系统和驱动程序的性能。
驱动程序不能使用锁来保护资源免受其其他函数与 MiniportInterrupt 和/或共享的读取或写入访问权限 MiniportDisableInterruptEx 函数。 相反,驱动程序必须调用 NdisMSynchronizeWithInterruptEx ,以便其 MiniportSynchronizeInterrupt 函数在其所在的同一 DIRQL 上访问此类共享资源
MiniportInterrupt 和/或 MiniportDisableInterruptEx 函数执行此操作。
有关获取和释放 NDIS 旋转锁的详细信息,请参阅 网络驱动程序中的同步和通知。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 已弃用 NDIS 6.20 及更高版本的驱动程序,应使用 NdisAcquireRWLockRead 或 NdisAcquireRWLockWrite 而不是 NdisDprAcquireReadWriteLock。 在 NDIS 6.0 和 6.1 中受支持。 |
目标平台 | 通用 |
标头 | ndis.h (包括 Ndis.h) |
Library | Ndis.lib |
IRQL | = DISPATCH_LEVEL |