std::lock_guard 是否在使用 std::adopt_lock 选项构造后释放互斥量?
Does std::lock_guard release the mutex after constructed with std::adopt_lock option?
我知道我的问题与此 非常相似,但我看到的行为并非如此。这是我的代码:
#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
选项构建后释放互斥量?”。希望大家能帮我弄清楚这个情况。谢谢。
程序有未定义的行为。
您创建了两个守卫,他们都认为自己拥有 mutex
并且他们都将 unlock
它。那是UB。
在 fun1
中使用 m.lock()
而不是使用守卫将是使其具有定义行为的一种方法。
当你构造一个 std::unique_lock
来管理互斥量时,你应该坚持使用它,除非你首先使用 std::unique_lock::release 打破 std::unique_lock
与互斥量的关联。在您的示例中,您在原始互斥量仍由 std::unique_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
选项构建后释放互斥量?”。希望大家能帮我弄清楚这个情况。谢谢。
程序有未定义的行为。
您创建了两个守卫,他们都认为自己拥有 mutex
并且他们都将 unlock
它。那是UB。
在 fun1
中使用 m.lock()
而不是使用守卫将是使其具有定义行为的一种方法。
当你构造一个 std::unique_lock
来管理互斥量时,你应该坚持使用它,除非你首先使用 std::unique_lock::release 打破 std::unique_lock
与互斥量的关联。在您的示例中,您在原始互斥量仍由 std::unique_lock
管理时触及了它,这是错误的。