Std :: Lock避免死锁,但此程序被卡住

全部, 提及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标准锁
func2锁m1
-----挂在这里。

即使func1释放了两个互斥锁,为什么func2仍不继续?

achievekey 回答:Std :: Lock避免死锁,但此程序被卡住

代替:

std::lock(m1,m2);

使用:

std::lock(lock1,lock2);

可以在参考页面上找到std::lock的更多详细信息(包括示例)。

为什么您的代码挂起?

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

因此,当func1结束时,两个互斥锁仍处于锁定状态,并且func2不能越过std::lock(m1,m2)行。

为什么固定代码起作用?

当您呼叫std::lock(lock1,lock2)时,std::unique_locklock1lock2)意识到这一点-他们现在拥有锁,并负责解锁(当它们超出范围时会发生这种情况。

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

本文链接:https://www.f2er.com/3059133.html

大家都在问