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

Multithreading 锁定层次结构和读写器互斥体,multithreading,boost,locking,mutex,deadlock,Multithreading,Boost,Locking,Mutex,Deadlock,假设我使用锁层次结构来避免死锁。如果我使用读写互斥体,我应该如何考虑和使用这些互斥体?每个读写互斥体的层次结构中是否存在(我能想到)不同的读锁和写锁?(如果是,这意味着这两个锁可以在层次结构中分配不同的级别。)使用读写互斥锁是否会在层次结构中引入死锁的可能性?(如果是,如何避免(如果有的话)?“可升级”锁(读卡器锁可以在不解锁互斥锁的情况下转换为写卡器锁)如何 是的,我看过一些建议,如果可能的话,可以避免(特别是读写器)互斥。这与是否普遍使用它们无关;假设存在一个问题,最好由读写互斥体来解决。同

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

是的,我看过一些建议,如果可能的话,可以避免(特别是读写器)互斥。这与是否普遍使用它们无关;假设存在一个问题,最好由读写互斥体来解决。同样,不要仅仅因为您通常喜欢锁层次结构就建议它们的替代方案。(但是,如果将读写互斥体与锁层次结构相结合确实会引入死锁的可能性,请随意建议对所使用的概念进行修改。)


知道我正在考虑使用Boost线程库的多线程程序可能会有所帮助。读写互斥类在那里称为shared_mutex;unique_lock是一个独占(writer)锁;共享_锁是一个共享(读卡器)锁;升级锁是一种读卡器锁,可以临时升级为写卡器锁。

为了进行锁排序,必须将其视为单个锁。如果您有锁A和R-W锁B,并且有两个线程执行此操作:

  • 锁定A,等待读取(B)
  • 锁定写入(B),等待A

  • 他们仍然会陷入僵局。

    啊,我明白了。然而,我认为这还不够。假设它们都这样做:
    读取锁B,等待升级以写入锁
    。因此,至少在使用升级锁时,必须更多地考虑避免死锁。我想到的另一个想法是读锁定互斥锁仍然允许其他读者也锁定它。因此,我认为更少的订购要求可能适用于读卡器。我从未使用过支持升级的锁,也不知道如何在没有死锁的情况下使用它们,这正是您指定的原因(除非您确保一次只有一个线程调用升级)。至于读者,请记住,如果队列中有W服务员,许多RW锁将不允许读者通过(以避免饥饿的作者)。因此,您可能无法依靠读卡器获得锁,即使此时锁仅在R模式下保持。