首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >std::condition_variable notify_all未同时唤醒所有线程

std::condition_variable notify_all未同时唤醒所有线程
EN

Stack Overflow用户
提问于 2018-01-12 14:14:39
回答 1查看 424关注 0票数 1

我想知道的是std::condition_variable notify_all是如何通知所有线程唤醒的。

情况是,我有一个主线程,一个渲染线程,每个线程都有自己的线程池来做它需要做的任何工作。例如,如果我有6个逻辑核心,那么每个线程池就有6个工作线程。这些线程是使用notify_all唤醒的。每个线程池都有自己的条件变量/互斥锁组合,并且是完全独立的,因此它们不会相互冲突。

我遇到的问题是,有时候,当渲染线程调用notify_all来唤醒工作线程时,一些线程会立即被唤醒,一些线程需要很长时间才能唤醒,大约需要几毫秒。

我还注意到,这主要发生在这些线程被唤醒时,而主线程工作者正忙于自己的工作。因此,在负载较重的时候,当每个逻辑核心已经有一个线程在工作时,尝试唤醒这些其他线程会表现出这种行为。因此,在等待condition_variable的6个线程中,可能有4个线程会被唤醒,而其他两个线程在负载下降之前不会被唤醒。

我的问题是,这是意料之中的行为,还是我应该在我的代码中寻找错误?请注意,线程总是被唤醒,并且在无负载或轻负载的情况下,它们通常在大约相同的时间被唤醒。我的线程池设置也没有死锁或任何其他问题。那么,我看到的是condition_variable的正确行为吗?其中一些线程可以被快速唤醒,另一些线程可以在4或5毫秒后唤醒?我如何减轻这种行为?有没有人能推荐一种替代的方法来唤醒我的工作线程,最好的方式呢?

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-01-12 14:20:07

它们不能被唤醒,直到它们被调度。如果其他线程正在运行,它们将首先完成它们的时间片。

否则这是如何工作的呢?

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

https://stackoverflow.com/questions/48220582

复制
相关文章

相似问题

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