同时持有两个互斥锁
Holding two mutex locks at the same time
我想知道同时持有两个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
然后两个都阻止尝试锁定另一个)等待另一个释放其中一个锁以便能够继续(并释放他们自己持有的锁,这将允许另一个继续)。
所以,一般的经验法则是;如果您需要获得多个锁,请务必确保所有线程始终 尝试以相同的顺序获取这些锁。
如果任何人以相反的顺序获取两个互斥体,这可能导致死锁。
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
提供了针对此的保护,尽管基础 OS 可能。
我想知道同时持有两个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
然后两个都阻止尝试锁定另一个)等待另一个释放其中一个锁以便能够继续(并释放他们自己持有的锁,这将允许另一个继续)。
所以,一般的经验法则是;如果您需要获得多个锁,请务必确保所有线程始终 尝试以相同的顺序获取这些锁。
如果任何人以相反的顺序获取两个互斥体,这可能导致死锁。
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
提供了针对此的保护,尽管基础 OS 可能。