std :: condition_variable notify_all不会同时唤醒所有线程

时间:2018-01-12 06:14:39

标签: windows multithreading c++11 threadpool condition-variable

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

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

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

我还注意到,当主线程工作者忙于自己的工作时,这些线程被唤醒时会发生这种情况。因此,在每个逻辑核心已经有一个线程工作时,在负载很重的时候,尝试唤醒这些其他线程就会出现这种情况。因此,在等待condition_variable的6个线程中,可能会有4个被唤醒,而其他两个线程将不会被加载。

我的问题是,这是预期的行为,还是我应该查看代码中的错误?注意,线程总是被唤醒,在无负载或轻负载时,它们通常会在大约相同的时间唤醒。我的线程池设置也没有死锁或任何其他问题。所以,我只是看到condition_variable的正确行为,其中一些线程可以快速唤醒而其他线程可以在4或5毫秒后唤醒?我该如何缓解这种行为?任何人都可以建议另一种方法来唤醒可能效果最好的工作线程吗?

提前致谢。

1 个答案:

答案 0 :(得分:2)

在他们安排之前,他们不能被唤醒。如果其他线程正在运行,则他们首先完成时间片。

这还有什么用?