gpt4 book ai didi

c++ - std::lock 仍然导致死锁

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:42:18 25 4
gpt4 key购买 nike

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 锁定 m1func2 锁 m2func2 锁定 m1func1 锁 m2func2 标准锁

然后控制台挂了...

最佳答案

我认为您尝试做的是行不通的:您不能默默地修改唯一锁下的互斥量。根据规范,“延迟”构造函数使锁守卫“不拥有”,您无法更改:

unique_lock(mutex_type& m, defer_lock_t) noexcept;

Effects: Constructs an object of type unique_lock.

Postconditions: pm == addressof(m) and owns == false.

修改仅供说明的 owns 变量的唯一方法是作用于唯一锁。唯一锁不会神奇地检查持有的互斥锁的状态。

正确的代码应该将唯一锁传递给std::lock 算法:

std::lock(lock1, lock2);

关于c++ - std::lock 仍然导致死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45821512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com