首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在调用std::condition_variable::notify_one()之前多次调用std::condition_variable::wait()

在调用std::condition_variable::notify_one()之前多次调用std::condition_variable::wait()
EN

Stack Overflow用户
提问于 2020-11-18 20:19:20
回答 2查看 209关注 0票数 0

我正在努力理解std::condition_variable的使用方式。假设我有生产者线程和消费者线程,这两个线程都在同一个condition_variable上操作。Producer会快速填充要处理的数据,并在每次将数据推送到容器时调用std::condition_variable::notify_one()。因此,假设Producer推送了10个项目,并调用了notify_one() 10次,甚至在消费者可以处理最先添加的数据之前。现在生产者线程退出了,所以它将不再调用nootify_one(),那么等待condition_variable的消费者线程会发生什么呢?之前对notify_one()的9次调用是否会被排队,消费者是否会再被解锁9次?

EN

回答 2

Stack Overflow用户

发布于 2020-11-18 20:35:33

来自cppreference

如果有任何线程正在等待*这个,则调用notify_one来解除其中一个等待线程的阻塞。

问题是,这应该无关紧要。任何使用condition_variable的使用者都必须检查是否允许它们继续,也就是说,是否有任何可用的数据。在你描述的情况下,他们会发现有,所以他们不会被暂停,也不需要通知。

或者,换句话说,当没有数据可用时,它们将被挂起,并且只有在生产者添加新数据并使用任何挂起的消费者调用notify_one之后,它们才会被唤醒。

票数 2
EN

Stack Overflow用户

发布于 2020-11-19 00:30:46

condition_variable::notify_one()condition_variable::notify_all() 不记录它们被调用的次数。它们适用于调用时正在等待的任何线程。稍后等待条件变量的线程不会受到先前调用的影响。它由程序来跟踪是否有任何工作悬而未决。

这就是从循环中调用wait()的原因:

代码语言:javascript
复制
while (no_data_ready())
    myvar.wait();

也就是说,只有在无事可做时才等待。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64892997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档