std::condition_variable真的在阻塞之前解锁给定的unique_lock对象吗



正如引用所说:1(原子解锁锁,阻塞当前执行线程,然后。。。

我有以下代码:

#include <iostream>
#include <thread>
#include <condition_variable>
std::mutex mutex_;
std::condition_variable condVar;
std::unique_lock<std::mutex> lck(mutex_); //purposely global to check return of owns_lock() in main
void waitingForWork()
{
std::cout << "Before wait, lck.owns_lock() = " << lck.owns_lock() << 'n';
condVar.wait(lck);
std::cout << "After wait, lck.owns_lock() = " << lck.owns_lock() << 'n';
}
int main()
{
std::thread t1(waitingForWork);
std::this_thread::sleep_for(std::chrono::seconds(10));
std::cout << "In main, lck.owns_lock() = " << lck.owns_lock() << 'n';
condVar.notify_one();
t1.join();
return 0;
}

使用:g++ with c++17 on ubuntu编译

输出:

Before wait, lck.owns_lock() = 1
In main, lck.owns_lock() = 1
After wait, lck.owns_lock() = 1

但根据参考,我希望互斥体在等待时解锁,即:

In main, lck.owns_lock() = 0

有人能告诉我为什么会这样吗?

您必须进一步阅读:

当解除阻止时,无论出于何种原因,都会重新获取锁并等待退出。如果此函数通过异常退出,则也会重新获取锁。

因此,总是可以保证在等待退出时,会重新获取锁。

最新更新