5

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

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,因为我们已经m在步骤 1 中锁定了。

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

4

1 回答 1

1

您的问题中引用的维基百科文章有一个下标说明

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

条件变量函数的标准“等待”通常接受两个参数:条件变量和互斥体。互斥锁m由“等待”函数释放,线程休眠直到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并休眠,直到收到 on 信号c

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

于 2018-07-10T03:13:44.113 回答