gpt4 book ai didi

c++ - 非成员函数锁的使用方法

转载 作者:太空宇宙 更新时间:2023-11-04 16:05:01 24 4
gpt4 key购买 nike

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

mutex m1;
mutex m2;

template<typename T>
void foo(const T& t){
m1.lock();
cout << t << '\n';
m1.unlock();
}

int main(){
thread t1{foo<string>,"lock m1"};
unique_lock<mutex> lck1{m1,defer_lock};
unique_lock<mutex> lck2{m2,defer_lock};
lock(lck1,lck2);
t1.join();
return 0;
}

非成员函数 lock 是为了避免死锁而设计的,对吧?为什么我的程序还是死锁?

最佳答案

这里

lock(lck1,lck2);
t1.join();

您锁定互斥锁 m1,然后等待 t1 完成。

t1 中,您还锁定了 m1 - 这里

m1.lock();

如果 lock(lck1,lck2);m1.lock(); 之前成功,你就会遇到死锁,因为 t1 永远不会完成,因为main 锁定了 m1

如果 m1.lock();lock(lck1,lck2); 之前成功,程序将正常执行。

但是,您无法知道哪个锁成功了。

关于c++ - 非成员函数锁的使用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36965116/

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