因此,我正在一个工作系统上工作,池中的线程将队列中的作业从队列中拉出并运行它们,并且每个作业都可能将其他作业排队。队列当前是无锁的,并且所有线程都在等待一个信号量,该信号量在添加作业而不是忙等待时会增加。
现在我试图添加在主线程上运行队列作业的能力,我认为这就像拥有只有主线程可以从中拉出的第二个队列一样简单,但是我是我无法弄清楚如何防止主线程忙于等待。
如果我保持等待信号量的当前行为,则当作业被添加到全局队列时主线程将被唤醒,但是当它们被添加到主线程的队列时则不会唤醒,这是一个问题。 / p>
我可以有第二个信号量跟踪主线程队列中的作业,但据我所知,Windows是唯一允许同时等待多个信号量的平台(通过WaitForMultipleObjects
),系统应该是跨平台的。
我可以用条件变量来做,但就像我说底层队列是无锁的,std::mutex
很慢。我真的不喜欢使用虚拟锁定的想法,特别是如果它们必须是std::mutex
es。
我也可以让主线程忽略全局队列,只从自己的队列中拉出作业并等待自己的信号量,这样我就可以创建一个更多的工作线程,并允许操作系统取消主线程的调度等待工作。但是,如果有人想要使用主线程,我不喜欢引发上下文切换的想法。
对于任何工作系统来说,这似乎应该是非常普遍的行为,但我没有找到它要研究的例子。我在这里找不到一种方法吗?