实现写优先 R/W 锁

5 mutex locking readwritelock rwlock

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

https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock

我了解读优先锁,但不了解写优先锁。有人可以解释如何实施吗?

具体来说,我不明白这部分:

While w:
  wait c, m
Run Code Online (Sandbox Code Playgroud)

我也不明白该标志是否w是通用的,或者只是每个进程有一个不同的标志。我认为是前者。

例如,这里我们看到获取读锁的算法:

Lock m (blocking).
While (w or r > 0):
  wait c, m
Set w to true.
Unlock m.
Run Code Online (Sandbox Code Playgroud)

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

而且, for Set w to true- 这是否意味着w必须在所有进程中或仅在这个进程中设置为 true ?

Chr*_*ber 1

您的问题中引用的维基百科文章有一个下标注释,其中指出:

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

条件变量函数的标准“等待”通常接受两个参数:条件变量和互斥体。互斥量m由“wait”函数释放,并且线程休眠直到c收到信号。一旦收到信号并且线程继续,就会重新获取锁m(如果在其他地方获取了锁,则可能需要等待) 。c

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

m仅当通过修改条件变量、整数(等待的读取器数量)、标志(写入器等待)来协商设置或释放读/写状态的关键部分时,互斥体才会被锁定。crw

您发布的用于获取读锁的伪代码(实际上是获取写锁,因此)Set w to true同时使用互斥锁 ( m) 和条件变量( c)。首先,它尝试获得互斥体上的独占锁m,以便以原子方式修改相关输入。一旦实现这一点,它就会调用wait c, mif w(write lock) 或r(readers waiting) 非零。

总结一下:

  • “wait”函数接受两个参数:cm。它会释放m并休眠,直到收到 上的信号c

  • m当设置或释放读锁或写锁时,互斥锁被锁定。