std::condition_variable cv;
std::mutex m_cnt;
int cnt = 0;
void producer() {
std::unique_lock<std::mutex> ul(m_cnt);
cnt++;
cv.notify_one();
std::this_thread::sleep_for(std::chrono::seconds(1));
}
void consumer() {
std::unique_lock<std::mutex> ul(m_cnt);
cv.wait(ul, [] {return cnt > 0;}); // ---> Here
cnt--;
}
在下面的示例中,
cv.wait()
中会发生什么?它已被 producer
通知,但没有 m_cnt
(锁定)以进一步移动。一旦 consumer
被“通知”,它是否会继续无限期地尝试获取锁?
https://en.cppreference.com/w/cpp/thread/condition_variable/wait
void wait( std::unique_lock<std::mutex>& lock );
...
wait()
,当解除阻塞时(被其他线程称为 notify_one()
或 notify_all()
),调用 lock.lock()
(可能在锁上阻塞),然后返回。
所以,是的,它正在按照您所描述的方式工作 - 条件变量被调用并且本身不再阻塞,但是锁定互斥锁将阻塞,直到互斥锁变得可用。