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及更高版本:如果在任何 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

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)
Library Ndis.lib
IRQL <=DISPATCH_LEVEL

另请参阅

FilterAttach

自旋锁简介

MiniportInitializeEx

NDIS 扩展 (Ndiskd.dll)

NDIS_RW_LOCK_EX

NdisAcquireRWLockRead

NdisAcquireRWLockWrite

NdisFRegisterFilterDriver

NdisFreeRWLock

NdisMRegisterMiniportDriver

NdisOpenAdapterEx

NdisRegisterProtocolDriver

NdisReleaseRWLock