5

例如,在 Java 平台上的 Fork / Join 框架中可以使用工作窃取。(请参阅Fork /join framework 如何比线程池更好?) - OmniThreadLibrary 是否有类似的可能?


工作窃取:无事可做的工作线程可以从其他仍在忙碌的线程中窃取任务。

4

1 回答 1

6

我不知道我是否会将这种技术称为“工作窃取”,但确实 OmniThreadLibrary 在执行 Fork/Join 抽象时让所有核心都处于忙碌状态。

当您使用 Fork/Join 时,您通过调用将任务发送到计算池中Compute。当您调用Value以获取子计算的结果或Await等待子计算完成并且子计算尚未完成其工作时,Value/Await将从计算池中获取另一个任务并执行它。当这个新任务完成时,它会再次检查子计算是否完成了它的工作,如果没有,它会处理下一个子任务。

OmniThreadLibrary wiki上进一步描述了这种机制。


编辑

我不认为 Fork/Join 方法应该被称为“工作窃取”。在 OmniThreadLibrary 实现中,工作项永远不会分配给线程,直到线程开始执行它。一旦线程开始执行它,没有人可以窃取它,因为这样做没有任何目的。

于 2012-07-06T19:17:07.790 回答