同时拿着两个互斥锁

Pet*_*Six 5 c++ mutex thread-safety boost-mutex

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

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

void foo2()
{
   boost::recursive_mutex::scoped_lock lock(mutex2);
}
Run Code Online (Sandbox Code Playgroud)

我知道这不会导致僵局.但是还有其他问题吗?也许这会导致线程睡眠时间过长?

D.S*_*ley 6

如果有人以相反的顺序获得两个互斥导致死锁.

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

void bar2() {
    boost::recursive_mutex::scoped_lock lock(mutex1);
}
Run Code Online (Sandbox Code Playgroud)

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

                                 mutex1  mutex2
Time    Thread A     Thread B    owner   owner
  0     foo1()                     A
  1                  bar1()        A       B
  2                  bar2()        A       B
  3     foo2()                     A       B
Run Code Online (Sandbox Code Playgroud)

此时,线程A和B陷入僵局.boost虽然底层操作系统可能会提供保护,但我认为这并未提供保护.


Jes*_*uhl 5

持有多个锁本身并不是问题.

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

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