苗条阅读器/编写器 (SRW) 锁

精简的读取器/编写器(SRW)锁使单个进程的线程能够访问共享资源;它们针对速度进行优化,占用的内存很少。 无法跨进程共享精简的读取器-写入器锁。

读取器线程从共享资源读取数据,而编写器线程将数据写入共享资源。 当多个线程使用共享资源读取和写入时,如果读取器线程持续运行,但写入作很少,排他锁(如关键部分或互斥体)可能会成为瓶颈。

SRW 锁提供两种模式,线程可以访问共享资源:

  • 共享模式,该模式授予对多个读取器线程的共享只读访问权限,从而使它们能够同时从共享资源读取数据。 如果读取作超过写入作,则此并发比关键部分提高性能和吞吐量。

    注意

    不应以递归方式获取共享模式 SRW 锁,因为当与独占获取相结合时,这可能会导致死锁。

  • 独占模式,该模式一次授予对一个编写器线程的读/写访问权限。 当锁定以独占模式获取时,在编写器释放锁之前,任何其他线程都无法访问共享资源。

    注意

    无法以递归方式获取独占模式 SRW 锁。 如果线程尝试获取它已持有的锁,该尝试将失败(对于 TryAcquireSRWLockExclusive) 或死锁(对于 AcquireSRWLockExclusive

可以在任一模式下获取单个 SRW 锁;读取器线程可以在共享模式下获取它,而编写器线程可以在独占模式下获取它。 不能保证请求所有权的线程将被授予所有权的顺序;SRW 锁既不公平,也不是 FIFO。

SRW 锁是指针的大小。 优点是快速更新锁定状态。 缺点是可以存储很少的状态信息,因此 SRW 锁不会检测共享模式下不正确的递归使用。 此外,在共享模式下拥有 SRW 锁的线程无法将其锁定所有权升级到独占模式。

调用方必须分配 SRWLOCK 结构,并通过调用 InitializeSRWLock(动态初始化结构)或将常量 SRWLOCK_INIT 分配给结构变量(以静态方式初始化结构)来初始化它。

可以使用 应用程序验证程序 查找 SRW 锁的递归(重新进入)用法。

以下是 SRW 锁函数。

SRW 锁函数 描述
AcquireSRWLockExclusive 以独占模式获取 SRW 锁。
AcquireSRWLockShared 在共享模式下获取 SRW 锁。
InitializeSRWLock 初始化 SRW 锁。
releaseSRWLockExclusive 释放以独占模式打开的 SRW 锁。
ReleaseSRWLockShared 释放在共享模式下打开的 SRW 锁。
SleepConditionVariableSRW 在指定的条件变量上休眠,并将指定的锁释放为原子作。
TryAcquiresRWLockExclusive 尝试以独占模式获取精简的读取器/编写器(SRW)锁。 如果调用成功,则调用线程获取锁的所有权。
TryAcquireSRWLockShared 尝试在共享模式下获取精简的读取器/编写器(SRW)锁。 如果调用成功,则调用线程获取锁的所有权。