精简读取器/写入器 (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) 锁。 如果调用成功,调用线程将获取锁定的所有权。