苗条阅读器/编写器 (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)锁。 如果调用成功,则调用线程获取锁的所有权。 |