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)
我知道这不会导致僵局.但是还有其他问题吗?也许这会导致线程睡眠时间过长?
这可如果有人以相反的顺序获得两个互斥导致死锁.
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虽然底层操作系统可能会提供保护,但我认为这并未提供保护.
持有多个锁本身并不是问题.
当其他线程尝试以不同的顺序获取相同的锁并且最终导致ABBA死锁时,会出现问题.线程1个锁A和B,然后线程2想要锁定B然后A和两个最终被阻塞(如果锁定交织所以T1锁A,然后T2锁B,然后两个块试图锁定另一个)等待其他释放锁之一为了能够继续(并释放他们自己的持有锁,这将允许对方继续).
所以,一般的经验法则是; 如果您需要获得多个锁,请确保所有线程始终尝试以相同的顺序获取这些锁.
| 归档时间: |
|
| 查看次数: |
1251 次 |
| 最近记录: |