Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows std::condition_变量notify_all未同时唤醒所有线程_Windows_Multithreading_C++11_Threadpool_Condition Variable - Fatal编程技术网

Windows std::condition_变量notify_all未同时唤醒所有线程

Windows std::condition_变量notify_all未同时唤醒所有线程,windows,multithreading,c++11,threadpool,condition-variable,Windows,Multithreading,C++11,Threadpool,Condition Variable,我想知道的是std::condition_变量notify_all在通知所有线程唤醒时是如何工作的 情况是,我有一个主线程,一个渲染线程,每个线程都有自己的线程池来完成它需要的任何工作。例如,如果我有6个逻辑核,每个线程池将有6个工作线程。使用notify_all唤醒这些线程。每个线程池都有自己的条件变量/mutex组合,并且是完全独立的,因此它们不会相互冲突 我遇到的问题是,有时候,当渲染线程调用notify_all来唤醒工作线程时,一些线程会立即被唤醒,而另一些线程会花费很长时间,以毫秒为单

我想知道的是std::condition_变量notify_all在通知所有线程唤醒时是如何工作的

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

我遇到的问题是,有时候,当渲染线程调用notify_all来唤醒工作线程时,一些线程会立即被唤醒,而另一些线程会花费很长时间,以毫秒为单位

我还注意到,当主线程工作人员忙于自己的工作时,这些线程被唤醒时,这种情况通常会发生。因此,当每个逻辑核心已经有一个线程在工作时,在重载情况下,试图唤醒这些其他线程会表现出这种行为。因此,在等待condition_变量的6个线程中,可能会有4个被唤醒,而另外两个在负载下降之前不会被唤醒

我的问题是,这是预期的行为,还是应该查找代码中的错误?请注意,线程总是会唤醒,在空载或轻载情况下,它们通常会在大约相同的时间唤醒。我的线程池设置也没有死锁或任何其他问题。那么,我是否看到了条件_变量的正确行为,其中一些线程可以很快被唤醒,而其他线程可以在4或5毫秒后被唤醒?我如何减轻这种行为?有人能建议一种唤醒我的工作线程的替代方法吗


提前感谢。

在安排好之前,不能叫醒他们。如果其他线程正在运行,它们将首先完成时间片


否则该如何工作?

好的,也许我已经理解了调度程序如何错误地处理所有这些线程。我想它可以阻止一些人给其他人时间,试图平衡负载?你是说,一旦线程运行,它就不能停止,直到它产生或发生某些同步吗?@Owens一旦操作系统启动线程,它就可以运行它的时间片。然后它将被中断,操作系统将再次安排。对,这是我的总体印象。我只是觉得时间片的时间要短得多。我看到的是一些线程等待4或5毫秒,基本上直到其他正在运行的线程完全进入睡眠状态,等待它们的同步。而且,请注意,当这些线程正在执行它们的作业时,每个作业之后都会有一个收益,特别是允许其他线程有机会运行。所以我在这里感到困惑,因为我希望至少有一个收益率允许条件_变量唤醒这些线程。看,既然切片是20ms,5ms实际上相当好。出于某种原因,我在考虑Windows。其他操作系统做不同的事情。