locking - 实现写优先 R/W 锁

标签 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意思?
这并不意味着等待获得两个 c 的锁定和 m , 因为我们已经锁定 m在步骤 1 中。

而且,对于 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"条件变量函数通常接受两个参数:条件变量和互斥锁。互斥锁 m由“等待”函数和 thread sleeps until c is signaled 释放. m重新获取锁(如果在其他地方获取了锁,则可能需要等待)一次 c发出信号,线程继续。

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

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

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

总结一下:

  • “等待”函数接受两个参数:cm .它发布 m并休眠直到在 c 上接收到信号.
  • 互斥锁 m设置或释放读或写锁定时被锁定。
  • 关于locking - 实现写优先 R/W 锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51110130/

    相关文章:

    java - ReadWriteLocks-(不可重入)它如何支持多个读者获取读锁

    sql-server - 如何在测试期间强制升级锁(以消除死锁问题)?

    c# - 多线程软件设计

    jquery - PhoneGap 单按钮按下正确方式,无多点触控干扰

    c++ - std::unique_lock 移动语义

    c++ - Windows 的 AcquireSRWLockExclusive 是递归的吗?

    mysql - 锁定池中的资源,同时允许其他人从资源池中订购其他资源

    attributes - pthread互斥锁的 “attribute”是什么?

    c - 厕所 key 示例中二进制信号量和互斥量之间的区别?

    c - C中读写锁的线程安全销毁