我有一个互斥锁库,正在尝试实现一个写偏好锁。 我正在看这个例子:
https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock
我理解读取首选锁,但我不理解写入首选锁。有人可以解释如何实现吗?
具体来说,我不明白这部分:
While w:
wait c, m
我也不明白标志w
是通用的,还是每个进程的不同标志。我认为是前者。
例如,这里我们看到获取读锁定的算法:
Lock m (blocking).
While (w or r > 0):
wait c, m
Set w to true.
Unlock m.
但是wait c, m
是什么意思? 这并不意味着等待锁定c
和m
,因为我们已经在步骤1中锁定了m
。
而且,对于Set w to true
- 这是否意味着必须在所有流程中将w
设置为 true,或者仅在此流程中设置为真?
您的问题中引用的维基百科文章有一个下标注释,指出:
This is the standard "wait" operation on condition variables, which, among other actions, releases the mutex m.
条件变量函数的标准"等待"通常接受两个参数:条件变量和互斥锁。互斥锁m
由"等待"函数释放,线程休眠,直到发出c
信号。一旦发出信号并且线程继续,就会重新获取m
锁(如果已在其他地方获取了锁,则可能需要等待c
。
将 (全局( 标志w
设置为 true 表示写锁定当前由写入线程声明
。 只有当通过修改条件变量c
、整数r
(等待的读取器数量(、标志w
(写入器等待(来协商设置或释放读/写状态的关键部分时,互斥m
才会被锁定。
您发布的用于获取读锁(实际上是获得写锁,因此Set w to true
(的伪代码同时使用互斥锁(m
(和条件变量(c
(。首先,它尝试在互斥m
上实现独占锁,以便以原子方式修改相关输入。实现此目的后,它会调用wait c, m
w
(写锁定(或r
(读取器等待(是否为非零。
总结一下:
"等待"函数接受两个参数:
c
和m
。它释放m
并休眠,直到收到c
信号。设置或释放读锁定或写锁定时,互斥锁
m
被锁定。