6

我想知道如果我同时持有两个 boost::scoped_locks 是否会有任何问题。锁正在锁定不同的互斥锁。考虑以下示例:

void foo1()
{
   boost::recursive_mutex::scoped_lock lock(mutex1);
   foo2();
}

void foo2()
{
   boost::recursive_mutex::scoped_lock lock(mutex2);
}

我知道这不应该导致死锁。但是有没有其他问题。也许这会导致线程睡眠时间过长?

4

2 回答 2

7

如果有人以相反的顺序获取两个互斥锁,这可能会导致死锁。

void bar1() {
    boost::recursive_mutex::scoped_lock lock(mutex2);
    bar2();
}

void bar2() {
    boost::recursive_mutex::scoped_lock lock(mutex1);
}

如下交错的两个线程会死锁:

                                 mutex1  mutex2
Time    Thread A     Thread B    owner   owner
  0     foo1()                     A
  1                  bar1()        A       B
  2                  bar2()        A       B
  3     foo2()                     A       B

此时线程 A 和 B 处于死锁状态。boost尽管底层操作系统可能会提供保护,但我认为这并不能提供保护。

于 2016-07-20T19:36:51.173 回答
6

持有多个锁本身不是问题。

当其他线程尝试以不同的顺序获取相同的锁并且最终导致ABBA死锁时,就会出现问题。线程 1 锁定AB然后线程 2 想要锁定,B然后A两者都被阻塞(如果锁定交错,所以 t1 锁定A,然后 t2 锁定B,然后都阻塞试图锁定另一个)等待另一个释放其中一个锁为了能够继续(并释放他们自己持有的锁,这将允许其他人继续)。

所以,一般的经验法则是;如果您需要获得多个锁,请确保所有线程始终尝试以相同的顺序获取这些锁。

于 2016-07-20T19:36:33.640 回答