【发布时间】:2018-01-12 06:14:39
【问题描述】:
我想知道的是 std::condition_variable notify_all 如何通知所有线程唤醒。
情况是我有一个主线程,一个渲染线程,每个线程都有自己的线程池来完成它需要的任何工作。例如,如果我有 6 个逻辑核心,则每个线程池将有 6 个工作线程。这些线程是使用 notify_all 唤醒的。每个线程池都有自己的条件变量/互斥体组合,并且是完全独立的,因此它们不会相互冲突。
我遇到的问题是,有时,当渲染线程调用 notify_all 来唤醒工作线程时,有些会立即唤醒,有些会需要很长时间,大约为几毫秒。
我还注意到,这主要发生在这些线程被唤醒而主线程工作人员忙于自己的工作时。因此,在每个逻辑核心已经有一个线程在工作的重负载时,尝试唤醒这些其他线程会表现出这种行为。所以在等待 condition_variable 的 6 个线程中,可能有 4 个会被唤醒,另外两个直到负载下降时才会被唤醒。
我的问题是,这是预期的行为,还是我应该寻找代码中的错误?请注意,线程总是唤醒,并且在空载或轻负载下,它们通常在大约同一时间唤醒。我的线程池设置也没有死锁或任何其他问题。那么,我是否只是看到了 condition_variable 的正确行为,其中一些线程可以快速唤醒,而另一些线程可以在 4 或 5 毫秒后唤醒?如何减轻这种行为?谁能建议一种替代方法来唤醒我的工作线程可能效果最好?
提前致谢。
【问题讨论】:
标签: windows multithreading c++11 threadpool condition-variable