std::lock 是用来防止死锁的,对吗?但在我的测试中,它仍然导致死锁。你能检查一下我的测试代码,看看我是否使用了错误的代码吗?
std::mutex m1;
std::mutex m2;
void func1()
{
std::unique_lock<std::mutex> lock1(m1, std::defer_lock);
printf("func1 lock m1\n");
std::this_thread::sleep_for(std::chrono::seconds(2));
std::unique_lock<std::mutex> lock2(m2, std::defer_lock);
printf("func1 lock m2\n");
std::lock(m1, m2);
printf("func1 std lock\n");
}
void func2()
{
std::unique_lock<std::mutex> lock1(m2, std::defer_lock);
printf("func2 lock m2\n");
std::this_thread::sleep_for(std::chrono::seconds(2));
std::unique_lock<std::mutex> lock2(m1, std::defer_lock);
printf("func2 lock m1\n");
std::lock(m2, m1);
printf("func2 std lock\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
std::thread th1(func1);
std::thread th2(func2);
th1.join();
th2.join();
return 0;
}
输出是:
func1 锁 m1
func2 锁 m2
func2 锁 m1
func1 锁 m2
func2 标准锁
然后控制台挂了...
我认为你想要做的事情不起作用:你不能默默地修改唯一锁下的互斥体。根据规范,“延迟”构造函数使锁防护“不拥有”,并且您无法更改它:
unique_lock(mutex_type& m, defer_lock_t) noexcept;
Effects:构造一个类型的对象unique_lock
.
后置条件: pm == addressof(m)
and owns == false
.
修改exposition-only的唯一方法owns
变量是通过作用于唯一锁来实现的。独特的锁不会神奇地检查所持有的互斥锁的状态。
正确的代码应该将唯一的锁传递给std::lock
算法:
std::lock(lock1, lock2);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)