我想知道如果同时持有两个boost::scoped_locks是否会有任何问题。锁正在锁定不同的互斥锁。考虑以下示例:
void foo1()
{
boost::recursive_mutex::scoped_lock lock(mutex1);
foo2();
}
void foo2()
{
boost::recursive_mutex::scoped_lock lock(mutex2);
}
我知道这不会造成僵局。但是还有其他问题吗?也许这可能导致线程睡眠太长时间?
最佳答案
拥有多个锁本身并不是问题。
当其他线程尝试以不同的顺序获取这些相同的锁并且最终导致ABBA
死锁时,就会出现问题。线程1锁定A
和B
,然后线程2想要锁定B
然后A
并最终都被阻塞(如果锁定交错,则t1锁定A
,然后t2锁定B
,然后两个块都试图锁定另一个)等待另一个释放其中一个锁以便能够继续(并释放自己持有的锁,这将允许另一个继续)。
因此,一般的经验法则是:如果您需要获得多个锁,请确保所有线程始终尝试以相同顺序获取这些锁。