【发布时间】:2021-12-02 12:02:25
【问题描述】:
我知道我的问题与Why does std::lock_guard release the lock after using std::adopt_lock? 非常相似,但我看到的行为并非如此。这是我的代码:
#include <mutex>
#include <iostream>
using namespace std;
std::mutex m;
void fun2();
void fun1() {
cout << "fun1" << endl;
std::unique_lock<std::mutex> guard(m);
cout << "lock mutex" << endl;
fun2();
if (guard.owns_lock()) {
cout << "still holds mutex" << endl;
}
else {
cout << "doesn't hold mutex" << endl;
}
}
void fun2() {
std::lock_guard<std::mutex> guard(m, std::adopt_lock);
cout << "fun2" << endl;
}
int main(int argc, char* argv[]) {
fun1();
return 0;
}
这是我得到的结果:
fun1
lock mutex
fun2
still holds mutex
显然,fun1 中的 unique_lock 仍然持有互斥锁。所以我的问题是“std::lock_guard 在使用std::adopt_lock 选项构造后是否释放互斥锁?”。希望大家能帮我澄清一下这种情况。谢谢。
【问题讨论】:
-
std::adopt_lock锁定策略假定线程已经拥有互斥锁的所有权。 -
但是
std::lock_guard退出fun2时会解锁析构函数中的互斥锁吗? -
是的,它会,但是
fun1内部的guard不会知道互斥体状态的变化。在调用fun2之后,您可以通过在fun1中调用if (m.try_lock()) cout << "locked\n";来检查互斥体状态变化 -
@TedLyngmo 如果是这样的话,
try_lock里面的fun1是如何在我之前的评论代码中成功的? -
@Harry 在致电
fun2之前,您是否尝试过try_lock?你不是try_locking 正确的事情。if (guard.try_lock()) cout << "locked\n";是正确的try_lock
标签: c++ multithreading c++11 mutex unique-lock