实现写优先R / W锁

时间:2018-06-29 22:28:28

标签: locking mutex readwritelock rwlock

我有一个互斥锁库,正在尝试实现写优先锁定。 我正在看这个例子:

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是什么意思? 这并不意味着要等待同时锁定cm,因为我们已经在步骤1中锁定了m

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

1 个答案:

答案 0 :(得分:1)

问题has a subscript note中引用的Wikipedia文章指出:

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,整数c(等待阅读器的数量)来协商设置critical section设置或释放读/写状态的conditional variable时,锁定互斥锁r ,标记w(正在等待写作者)。

您发布的用于获取读锁(实际上正在获取写锁,因此Set w to true)的伪代码同时使用了互斥锁(m)和{{3} }(c)。首先,它试图在互斥体m上获得排他锁,以便以原子方式修改相关输入。一旦完成此操作,如果wait c, m(写锁定)或w(读者等待)不为零,它将调用r

总结:

  • “等待”功能接受两个参数:cm。它释放m并休眠,直到在c上收到信号为止。

  • 互斥锁m在设置或释放读取或写入锁定时被锁定。