繁体   English   中英

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

[英]Calling std::condition_variable::notify_one() multiple times before std::condition_variable::wait() is called

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

cppreference

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

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

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

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

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

while (no_data_ready())
    myvar.wait();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM