全部, 提及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仍不继续?