我有一个互斥体库,并且正在尝试实现一个写优先锁。
我正在看这个例子:
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
, 因为我们已经锁定 m
在步骤 1 中。而且,对于
Set w to true
- 这是否意味着 w
必须在所有进程中设置为 true 还是仅在这个进程中设置?
最佳答案
您的问题中引用的维基百科文章has a subscript note指出:This is the standard "wait" operation on condition variables, which, among other actions, releases the mutex m.
Standard "wait"条件变量函数通常接受两个参数:条件变量和互斥锁。互斥锁 m
由“等待”函数和 thread sleeps until c
is signaled 释放. m
重新获取锁(如果在其他地方获取了锁,则可能需要等待)一次 c
发出信号,线程继续。
设置(全局)标志 w
为 true 表示写锁当前被写线程声明。
互斥锁 m
仅在协商 critical section 时被锁定通过修改条件变量来设置或释放读/写状态c
, 整数 r
(等待的读者数量),标志 w
(作者等待)。
您发布的用于获取读锁(实际上是获得写锁,因此 Set w to true
)的伪代码同时使用了互斥锁( m
)和 conditional variable ( c
)。首先,它尝试在互斥锁 m
上获得排他锁。为了以原子方式修改相关输入。一旦实现,它会调用 wait c, m
如果 w
(写锁)或 r
(读者等待)非零。
总结一下:
c
和 m
.它发布 m
并休眠直到在 c
上接收到信号. m
设置或释放读或写锁定时被锁定。 关于locking - 实现写优先 R/W 锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51110130/