我想知道的是std::condition_variable notify_all是如何通知所有线程唤醒的。
情况是,我有一个主线程,一个渲染线程,每个线程都有自己的线程池来做它需要做的任何工作。例如,如果我有6个逻辑核心,那么每个线程池就有6个工作线程。这些线程是使用notify_all唤醒的。每个线程池都有自己的条件变量/互斥锁组合,并且是完全独立的,因此它们不会相互冲突。
我遇到的问题是,有时候,当渲染线程调用notify_all来唤醒工作线程时,一些线程会立即被唤醒,一些线程需要很长时间才能唤醒,大约需要几毫秒。
我还注意到,这主要发生在这些线程被唤醒时,而主线程工作者正忙于自己的工作。因此,在负载较重的时候,当每个逻辑核心已经有一个线程在工作时,尝试唤醒这些其他线程会表现出这种行为。因此,在等待condition_variable的6个线程中,可能有4个线程会被唤醒,而其他两个线程在负载下降之前不会被唤醒。
我的问题是,这是意料之中的行为,还是我应该在我的代码中寻找错误?请注意,线程总是被唤醒,并且在无负载或轻负载的情况下,它们通常在大约相同的时间被唤醒。我的线程池设置也没有死锁或任何其他问题。那么,我看到的是condition_variable的正确行为吗?其中一些线程可以被快速唤醒,另一些线程可以在4或5毫秒后唤醒?我如何减轻这种行为?有没有人能推荐一种替代的方法来唤醒我的工作线程,最好的方式呢?
提前谢谢。
发布于 2018-01-12 14:20:07
它们不能被唤醒,直到它们被调度。如果其他线程正在运行,它们将首先完成它们的时间片。
否则这是如何工作的呢?
https://stackoverflow.com/questions/48220582
复制相似问题