锁定 – 实现写入优先R / W锁定

我有一个互斥库,我正在尝试实现一个写入首选锁.

我在看这个例子:

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.

但等什么呢,我的意思是?
这并不意味着等待锁定c和m,因为我们已经在步骤1中锁定了m.

而且,对于Set w为true – 这是否意味着必须在所有进程或仅此进程中将w设置为true?

最佳答案 您在问题
has a subscript note中引用的维基百科文章指出:

这是条件变量的标准“等待”操作,除其他操作外,还会释放互斥锁m.

条件变量函数Standard “wait”通常接受两个参数:条件变量和互斥量.通过“等待”功能和thread sleeps until c is signaled释放互斥锁m.一旦发出c并且线程继续进行,则重新获取m锁定(这可能涉及在其他地方获得锁定时等待).

将(全局)标志w设置为true表示写入线程当前声明了写锁定.

只有在通过修改条件变量c,整数r(读取器等待的数量),标志w(写入器等待)协商设置或释放读/写状态的critical section时,互斥锁m才被锁定.

您发布的用于获取读锁定的伪代码(实际上是获取写锁定,因此Set w为true)使用互斥锁(m)和conditional variable(c).首先,它试图获得对互斥锁m的独占锁定,以便以原子方式修改相关输入.一旦达到此目的,它将调用wait c,m如果w(写锁定)或r(读取器等待)非零.

总结一下:

>“wait”函数接受两个参数:c和m.它释放m并休眠直到在c上接收到信号.
>设置或释放读锁定或写锁定时,互斥锁m被锁定.

点赞