实现写优先 R/W 锁

Implementing write-preferring R/W lock

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

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 或仅此进程?

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

This is the standard "wait" operation on condition variables, which, among other actions, releases the mutex m.

Standard "wait" on conditional variable functions typically accept two parameters: a conditional variable and a mutex. The mutex m is released by the "wait" function and the thread sleeps until c is signaled。一旦 c 发出信号并且线程继续,就会重新获取 m 锁(如果已在其他地方获取锁,则可能需要等待)。

将(全局)标志 w 设置为 true 表示写入线程当前正在声明写入锁。

互斥体m仅在通过修改条件变量c、整数r(数字)协商设置或释放read/write状态的critical section时被锁定读者等待),标志 w(作者等待)。

您发布的用于获取读锁(实际上是获取写锁,因此 Set w to true)的伪代码同时使用互斥锁 (m) 和 conditional variablec)。首先,它试图获得对互斥量 m 的独占锁定,以便以原子方式修改相关输入。一旦实现,如果 w(写锁)或 r(等待读者)非零,它会调用 wait c, m

总结一下:

  • "wait" 函数接受两个参数:cm。它释放 m 并休眠,直到在 c.

  • 上收到信号
  • 当设置或释放读锁或写锁时,互斥量 m 被锁定。