NdisAllocateRWLock 函数 (ndis.h)

NdisAllocateRWLock 函数分配 NDIS_RW_LOCK_EX类型的读/写锁变量。

语法

PNDIS_RW_LOCK_EX NdisAllocateRWLock(
  NDIS_HANDLE NdisHandle
);

参数

NdisHandle

从以下函数之一返回的句柄:

NdisMRegisterMiniportDriver
MiniportInitializeEx
NdisRegisterProtocolDriver
NdisOpenAdapterEx
NdisFRegisterFilterDriver
FilterAttach
Windows 8 和 Windows Server 2012 及更高版本:如果在 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

NDIS_RW_LOCK_EX 结构定义一次将共享资源的写入访问权限限制为一个非 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

旋转锁 简介

MiniportInitializeEx

NDIS 扩展 (Ndiskd.dll)

NDIS_RW_LOCK_EX

NdisAcquireRWLockRead

NdisAcquireRWLockWrite

NdisFRegisterFilterDriver

NdisFreeRWLock

NdisMRegisterMiniportDriver

NdisOpenAdapterEx

NdisRegisterProtocolDriver

NdisReleaseRWLock