首页 > 解决方案 > 在调用 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 次以上的阻塞?

标签: c++c++11condition-variable

解决方案


cppreference

如果有任何线程在 *this 上等待,则调用 notify_one 会解除对其中一个等待线程的阻塞。

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

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


推荐阅读