OmnithreadLibrary是否支持“偷工作”?

时间:2012-07-06 16:51:59

标签: delphi fork-join omnithreadlibrary

例如,Java平台上的Fork / Join框架中提供了工作窃取。 (参见How is the fork/join framework better than a thread pool?) - 与OmniThreadLibrary有类似的东西吗?


  

工作窃取:工作线程耗尽的事情可以从其他人那里窃取任务   线程仍然很忙。

1 个答案:

答案 0 :(得分:6)

我不知道我是否会将这种技术称为“偷工作”,但实际上OmniThreadLibrary会在执行Fork / Join抽象时保持所有核心的忙碌。

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

此机制在OmniThreadLibrary wiki进一步描述。


修改

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