4

我知道我的问题与此非常相似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

显然,unique_lockinfun1仍然持有互斥锁。所以我的问题是“使用选项std::lock_guard构造后是否释放互斥锁?”。std::adopt_lock希望大家能帮我澄清一下这种情况。谢谢你。

4

2 回答 2

2

当您构造 astd::unique_lock来管理互斥锁时,您应该坚持使用它,除非您首先std::unique_lock使用std::unique_lock::release打破与互斥锁的关联。在您的示例中,当它仍然由 a 管理时,您触摸了原始互斥锁std::unique_lock,这是错误的。

于 2021-10-14T06:44:10.987 回答
1

该程序具有未定义的行为。

你已经创建了两个都认为他们拥有mutex并且他们都会拥有unlock它的守卫。那是UB。

使用m.lock()infun1而不是使用守卫将是使其具有已定义行为的一种方法。

于 2021-10-14T05:27:45.457 回答