例如,在 Java 平台上的 Fork / Join 框架中可以使用工作窃取。(请参阅Fork /join framework 如何比线程池更好?) - OmniThreadLibrary 是否有类似的可能?
工作窃取:无事可做的工作线程可以从其他仍在忙碌的线程中窃取任务。
例如,在 Java 平台上的 Fork / Join 框架中可以使用工作窃取。(请参阅Fork /join framework 如何比线程池更好?) - OmniThreadLibrary 是否有类似的可能?
工作窃取:无事可做的工作线程可以从其他仍在忙碌的线程中窃取任务。
我不知道我是否会将这种技术称为“工作窃取”,但确实 OmniThreadLibrary 在执行 Fork/Join 抽象时让所有核心都处于忙碌状态。
当您使用 Fork/Join 时,您通过调用将任务发送到计算池中Compute
。当您调用Value
以获取子计算的结果或Await
等待子计算完成并且子计算尚未完成其工作时,Value
/Await
将从计算池中获取另一个任务并执行它。当这个新任务完成时,它会再次检查子计算是否完成了它的工作,如果没有,它会处理下一个子任务。
OmniThreadLibrary wiki上进一步描述了这种机制。
编辑
我不认为 Fork/Join 方法应该被称为“工作窃取”。在 OmniThreadLibrary 实现中,工作项永远不会分配给线程,直到线程开始执行它。一旦线程开始执行它,没有人可以窃取它,因为这样做没有任何目的。