【问题标题】:Does OmnithreadLibrary support "work stealing"?OmnithreadLibrary 是否支持“工作窃取”?
【发布时间】:2012-07-07 03:55:23
【问题描述】:

工作窃取例如在 Java 平台上的 Fork / Join 框架中可用。 (参见How is the fork/join framework better than a thread pool?)- OmniThreadLibrary 是否可以实现类似的功能?


工作窃取:无事可做的工作线程可以窃取其他人的任务 仍然很忙的线程。

【问题讨论】:

  • OtlParallel 单元提到了这一点,也可以看到这篇博文:thedelphigeek.com/2011/01/…
  • Shamballa,本文描述的是 ForEach 抽象,而不是 Fork/Join。
  • 非常抱歉,我应该更慢地阅读问题并更好地理解。

标签: delphi fork-join omnithreadlibrary


【解决方案1】:

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

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

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


编辑

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

【讨论】:

    猜你喜欢
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多