C ++ - 多个生产者多个消费者,为特定消费者生成而无需忙碌等待

时间:2017-05-09 02:47:55

标签: c++ multithreading synchronization producer-consumer job-scheduling

因此,我正在一个工作系统上工作,池中的线程将队列中的作业从队列中拉出并运行它们,并且每个作业都可能将其他作业排队。队列当前是无锁的,并且所有线程都在等待一个信号量,该信号量在添加作业而不是忙等待时会增加。

现在我试图添加在主线程上运行队列作业的能力,我认为这就像拥有只有主线程可以从中拉出的第二个队列一样简单,但是我是我无法弄清楚如何防止主线程忙于等待。

如果我保持等待信号量的当前行为,则当作业被添加到全局队列时主线程将被唤醒,但是当它们被添加到主线程的队列时则不会唤醒,这是一个问题。 / p>

我可以有第二个信号量跟踪主线程队列中的作业,但据我所知,Windows是唯一允许同时等待多个信号量的平台(通过WaitForMultipleObjects ),系统应该是跨平台的。

我可以用条件变量来做,但就像我说底层队列是无锁的,std::mutex很慢。我真的不喜欢使用虚拟锁定的想法,特别是如果它们必须是std::mutex es。

我也可以让主线程忽略全局队列,只从自己的队列中拉出作业并等待自己的信号量,这样我就可以创建一个更多的工作线程,并允许操作系统取消主线程的调度等待工作。但是,如果有人想要使用主线程,我不喜欢引发上下文切换的想法。

对于任何工作系统来说,这似乎应该是非常普遍的行为,但我没有找到它要研究的例子。我在这里找不到一种方法吗?

0 个答案:

没有答案