当条件变量收到通知但尚未获得锁定时会发生什么?

问题描述 投票:0回答:1
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
被“通知”,它是否会继续无限期地尝试获取锁?

c++ multithreading locking
1个回答
0
投票

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()
(可能在锁上阻塞),然后返回。

所以,是的,它正在按照您所描述的方式工作 - 条件变量被调用并且本身不再阻塞,但是锁定互斥锁将阻塞,直到互斥锁变得可用。

© www.soinside.com 2019 - 2024. All rights reserved.