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

时间:2011-05-04 15:44:34

标签: multithreading boost locking mutex deadlock

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

是的,如果可能的话,我已经看过避免(特别是读者 - 作者)互斥的建议。这不是关于是否一般使用它们;假设存在一个最好由读写器互斥体解决的问题。同样,不要仅仅因为您通常偏爱它而建议锁定层次结构的替代方案。 (但是,如果组合读写器互斥锁与锁定层次结构确实引入了死锁的可能性,请随意建议对使用过的概念进行更改。)

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

1 个答案:

答案 0 :(得分:1)

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

  1. 锁定A,等待阅读(B)
  2. 锁定写入(B),等待A
  3. 他们仍然会陷入僵局。