锁定层次结构和读写器互斥锁

问题描述:

假设我使用锁定层次结构来避免死锁。如果我使用读写器互斥体,我应该如何思考和使用这些互斥体?那里是否存在(我能想到)每个读写器互斥体的层次结构中的独特读锁和写锁? (如果是的话,这意味着这两个锁可以在层次结构中分配不同的级别。)使用读写器互斥锁是否会在层次结构中引入死锁的可能性? (如果是的话,可以避免如何(如果有的话))那么“可升级”锁(读卡器锁可以在没有解锁互斥锁的情况下可以变成写锁)呢?锁定层次结构和读写器互斥锁

是的,我已经看到了建议,以避免(特别是读写器)互斥体,如果可能的话。这不是关于是否一般使用它们;只是假设存在一个读者 - 写者互斥最好解决的问题。同样,不要仅仅因为你一般会喜欢它们而建议锁定层次结构的替代方案。 (但是,如果将读写器互斥体与锁定层次结合在一起确实会引入死锁的可能性,请随时建议修改已使用的概念。)

知道我正在考虑使用多线程程序可能会有帮助Boost线程库。读写器互斥类在那里被称为shared_mutex; unique_lock是独占(作家)锁; shared_lock是一个共享(读取器)锁; upgrade_lock是一个读卡器锁,可以暂时升级到写入锁。

您必须将其视为锁定顺序的单个锁。如果你有锁定A和RW锁定的B,并育有两个线程做到这一点:

  1. 锁甲,等待读取(B)
  2. 锁写(B),等待

他们仍然会陷入僵局。

+0

啊,我明白了。但是,我认为这还不够。假设他们都这样做:'读锁B,等待升级到写锁'。所以至少在使用升级锁时,必须考虑更多以避免死锁。对我来说另一个想法是,读取锁定互斥锁仍然允许其他读者锁定它。因此,我认为读者可能会有更少的订购要求。 – ecm 2011-05-05 18:29:30

+0

我从来没有使用具有升级能力的锁,并且看不到它们如何在没有死锁的情况下使用,完全因为您指定的原因(除非确保一次只有一个线程调用升级)。至于读者,请记住,如果队列中有W服务员(以避免饥饿的作者),许多RW锁不会让读者通过。所以你可能无法依靠读者能够获得锁,即使锁现在只在R模式下。 – 2011-05-07 04:30:46