2012-07-06 26 views
5

例如在Java平台的Fork/Join框架中可以使用工作窃取。 (请参阅How is the fork/join framework better than a thread pool?) - 与OmniThreadLibrary可能类似吗?OmnithreadLibrary是否支持“偷工作”?


工作窃取:运行出来的东西做可以盗取其他 线程仍在忙于任务工作线程。

+0

该OtlParallel单位提及这一点,也看到这篇博客文章:http://www.thedelphigeek.com/2011/01/parallel-for-implementation-1-overview.html – Shambhala 2012-07-06 18:54:31

+0

Shamballa,本文介绍了ForEach抽象,而不是叉/加入。 – gabr 2012-07-06 19:17:57

+1

我很抱歉,我应该慢慢阅读这个问题,理解得更好。 – Shambhala 2012-07-06 19:31:35

回答

6

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

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

该机制在OmniThreadLibrary wiki上进一步描述。


编辑

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