c++ - 在调用 std::condition_variable::wait() 之前多次调用 std::condition_variable::notify_one()
问题描述
我正在努力理解使用的方式std::condition_variable
。假设我有 Producer 和 consumer 线程,并且两者都在同一个condition_variable
. 生产者填充数据以非常快速地处理并在std::condition_variable::notify_one()
每次将数据推送到容器时调用。因此,假设生产者推送了 10 个项目并调用了notify_one()
10 次,甚至在消费者可以处理首先添加的数据之前。现在生产者线程退出了,所以它不会再调用nootify_one()
了,那么等待的消费者线程会发生什么condition_variable
?之前的 9 次呼叫是否notify_one()
会排队,消费者是否会被解除 9 次以上的阻塞?
解决方案
如果有任何线程在 *this 上等待,则调用 notify_one 会解除对其中一个等待线程的阻塞。
问题是,这应该没关系。任何使用 condition_variable 的消费者都必须检查他们是否被允许继续,也就是说,是否有任何可用数据。在你描述的情况下,他们会发现有,所以他们不会被暂停,也不需要通知。
notify_one
或者,换句话说,当没有数据可用时它们将被暂停,并且只有在生产者添加新数据并与任何暂停的消费者调用后才会唤醒。
推荐阅读
- sql - 如何将 2 台笔记本电脑连接到同一个 SQL Developer 数据库?
- php - 检测 php 脚本是从 schell_execute 调用还是手动运行
- angular - 如何在 HTML 中显示返回的数据
- mongodb - 在该数据存储中以十进制 128 显示客户端上的结果数据?
- spring - 将 spring 从 2.0 迁移到 2.1 后,Jackson 模块解串器无法正常工作
- python - 从不同的数组中按这些元素的顺序获取所选数组元素的索引
- java - 如何继续在数组上提供方法,直到它与其他数组相等
- c# - 在 Docker 容器 C# 中使用系统环境变量
- spring-boot - Spring Boot 跨源阻塞请求
- azure - Azure DevOps 中的 Azure 清除脚本