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