【问题标题】:Lock hierarchies and reader-writer mutexes锁定层次结构和读写器互斥锁
【发布时间】:2011-05-04 15:44:34
【问题描述】:

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

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

知道我正在考虑使用 Boost Thread 库的多线程程序可能会有所帮助。读写器互斥类在此处称为 shared_mutex ; unique_lock 是独占(写入器)锁; shared_lock 是共享(读者)锁; upgrade_lock 是一个读锁,可以临时升级为写锁。

【问题讨论】:

    标签: multithreading boost locking mutex deadlock


    【解决方案1】:

    出于锁定顺序的目的,您必须将其视为单个锁定。如果您有锁 A 和 R-W 锁 B,并且有两个线程执行此操作:

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

    他们仍然会陷入僵局。

    【讨论】:

    • 啊,我明白了。然而,我认为这还不够。假设他们都这样做:read-lock B, wait for upgrade to write-lock。所以至少在使用升级锁时必须考虑更多以避免死锁。我想到的另一个想法是,读锁定互斥体仍然允许其他读者也锁定它。因此,我认为对读者的订购要求可能会减少。
    • 我从未使用过支持升级的锁,并且完全看不到如何在没有死锁的情况下使用它们,这正是您指定的原因(除非您确保一次只有一个线程调用升级) .至于读者,请记住,如果队列中有 W 等待者,许多 RW 锁将不会让读者通过(以避免让写者挨饿)。因此,即使锁目前仅在 R 模式下持有,您也可能无法依赖读者能够获得锁。
    猜你喜欢
    • 1970-01-01
    • 2018-05-23
    • 2010-12-17
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 2013-02-11
    • 2015-10-26
    • 2010-12-08
    相关资源
    最近更新 更多