具有层次锁定的 RW 锁定

Posted

技术标签:

【中文标题】具有层次锁定的 RW 锁定【英文标题】:RW locks with hierarchy locking 【发布时间】:2017-02-15 03:04:33 【问题描述】:

我正在尝试构建一个层次锁定系统以避免死锁。这意味着将代码分解为层(或级别),并在每个级别仅允许锁定下一个级别。在同一级别内,您应该使用预定义的顺序锁定。这可以防止大多数死锁。 像这样http://www.drdobbs.com/parallel/use-lock-hierarchies-to-avoid-deadlock/204801163?pgno=1

对于互斥锁,这就像一个魅力,但对于读写锁,它会失败。例如,如果我拿了一个读锁,然后想把它变成写锁,这意味着我在同一级别上拿了一个新锁,这是这个算法所禁止的。

如何更改算法以适用于 RW 和互斥锁?我应该考虑其他一些算法吗?

PS:我正在编写 C++,但这个问题实际上也与理论问题相关

【问题讨论】:

读写锁是什么意思? 你能把问题编辑成独立的吗?如果该链接中断,那么它将留下一个不再可以理解的问题。一口气读完也会提高题型。 我添加了,但是层次锁定是一种已知算法,所以应该没有问题 @Jackson,读写锁与您在答案中描述的完全一样,读锁是多个线程可以持有的共享锁。当你写 lock 它时,你会等待,这样读者就会完成并获得一个独占锁 【参考方案1】:

鉴于事物 A 的读锁可以由 1 个以上的线程持有,而写锁必须由 1 个线程持有,并且如果有任何读锁则无法授予(我对什么是读锁和写锁的默认理解)关于)那么你不能这样做。

如果线程 1 和 2 具有读锁,它们中的任何一个如何将读锁转换为写锁?如果您允许这样做,那么一个线程有一个读锁,一个线程有一个写锁。您需要做的是释放您的读锁和该级别的所有其他锁,然后取出一组新的锁,其中包括您的写锁。在上述场景中,写锁线程现在将阻塞,直到另一个线程释放其读锁。

但是,如果您的读锁只能由单个线程持有,那么它与写锁有何不同?如果你有锁,那么你就可以独占访问被锁定的想法。

【讨论】:

你理解正确,如果线程 A 在第 2 级获得了一个读锁和一些互斥锁,然后我解锁了读锁,那么我就不能获得写锁。因为每个级别的锁必须保持一致的顺序 @Epic 在这种情况下,我认为你所能做的就是在这个级别释放你现有的锁,然后用写锁而不是读锁重新获取它们。

以上是关于具有层次锁定的 RW 锁定的主要内容,如果未能解决你的问题,请参考以下文章

并发的SQL表锁定[重复]

Mac Flutter 安装:无法访问锁定文件

如何在 iOS 7 和 iOS 8 中锁定设备方向

UIScrollView 子视图中滚动事件的锁定处理(在 UIScrollView 超级视图内)

java中的文件锁定

被 cifs 挂载存储锁定