我知道我的問題與此非常相似為什么 std::lock_guard 在使用 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
顯然,unique_lockinfun1仍然持有互斥鎖。所以我的問題是“std::lock_guard使用std::adopt_lock選項構造后是否釋放互斥鎖?”。希望大家能幫我澄清一下這個情況。謝謝你。
uj5u.com熱心網友回復:
當您構造 astd::unique_lock來管理互斥鎖時,您應該堅持使用它,除非您首先std::unique_lock使用std::unique_lock::release打破了與互斥鎖的關聯。在您的示例中,當它仍然由 a 管理時,您觸及了原始互斥鎖std::unique_lock,這是錯誤的。
uj5u.com熱心網友回復:
該程式具有未定義的行為。
你已經創建了兩個守衛,他們都認為他們擁有mutex并且他們都會擁有unlock。那是UB。
使用m.lock()infun1而不是使用守衛將是使其具有定義行為的一種方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/318748.html
上一篇:并發編程練習
下一篇:java.net.SocketException:使用Jmeter并發執行緒組時,套接字在腳本持續時間結束時關閉
