gpt4 book ai didi

c++ - std::Lock 避免了死锁,但该程序被卡住

转载 作者:行者123 更新时间:2023-12-02 01:26:14 24 4
gpt4 key购买 nike

所有,引用std::lock still caused deadlock中的问题

我仍然无法弄清楚下面的代码有什么问题。有人可以解释一下这个问题以及如何解决这个问题吗?为什么会挂?请帮忙。

#include <iostream>
#include <mutex>
#include <thread>
using namespace std;

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(1));
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(1));
std::unique_lock<std::mutex> lock2(m1, std::defer_lock);
printf("func2 lock m1\n");
std::lock(m1, m2);
printf("func2 std lock\n");
}



int main(int argc,char* argv[])
{
std::thread th1(func1);
std::thread th2(func2);
th1.join();
th2.join();
return 0;
}

看到的输出:func1锁m1
func2锁m2
func1锁m2
func1 std 锁
func2锁m1
-----卡在这里。

为什么即使 func1 已经释放了两个互斥锁,func2 也不继续执行?

最佳答案

而不是:

std::lock(m1, m2);

使用:

std::lock(lock1, lock2);

更多详细信息(包括示例)可以在 std::lock 的引用页上找到.

为什么你的代码挂起?

当调用std::lock(m1, m2)时,两个互斥体直接被锁定。 std::unique_lock(lock1lock2)都不知道这一点,因此它们无法解锁互斥体。

因此,当 func1 结束时,两个互斥锁仍处于锁定状态,并且 func2 无法继续执行 std::lock(m1, m2)线。

为什么固定代码可以工作?

当您调用 std::lock(lock1, lock2) 时,std::unique_lock(lock1lock2 )知道这一点 - 他们现在拥有锁,并负责解锁它们(当它们超出范围时会发生这种情况)。

因此,当 func1 结束时,两个互斥锁都被解锁,并且 func2 可以 继续执行 std::lock(lock1, lock2) 行。一切都很好。

关于c++ - std::Lock 避免了死锁,但该程序被卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58972363/

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