当前位置: 首页 > 知识库问答 >
问题:

OmnithreadLibrary支持“工作窃取”吗?

能可人
2023-03-14

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

工作窃取:工作线程用完了要做的事情,可以从其他仍然繁忙的线程中窃取任务。

共有1个答案

姚高韵
2023-03-14

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

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

这种机制在OmniThreadLibrary wiki上有进一步的描述。

编辑

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

 类似资料:
  • 我试图理解工作窃取对递归任务的影响:工作窃取的一个优点是,当前的工作线程/线程可能会执行自己的生成任务;增加数据局部性。但是,在常见情况下,当工作线程加入其生成的任务时会发生什么?例如: 我认为这里当前线程会被阻塞,因此无法从自己的队列中获取工作,因此另一个工作人员将不得不窃取这些工作。这将否认工作窃取的局部优势。然而,根据维基百科(https://en.wikipedia.org/wiki/Wo

  • 在我的项目中,我正在构建一个Java的执行框架,它接收来自客户端的工作请求。工作(大小不同)被分解为一组任务,然后排队等待处理。有单独的队列来处理每种类型的任务,每个队列都与一个ThreadPool相关联。ThreadPools的配置方式使引擎的整体性能达到最佳。 这种设计有助于我们有效地平衡请求的负载,大型请求不会占用系统资源。然而,当一些队列为空并且它们各自的线程池闲置时,该解决方案有时会变得

  • 我试图理解fork-join的窃取部分。fork-join池具有具有自己Deque的工作线程。如果工作线程自身的deque为空,则该线程从另一个工作线程中窃取。 线程如何访问其他线程的状态? 当所有者线程和窃取者线程尝试访问取消排队中的同一项目时,它不会产生同步问题吗?

  • 问题内容: 我想通过一种方法将任务提交到ForkJoinPool中: 注意,我使用的是JDK 7。 在后台,它们被转换为ForkJoinTask对象。我知道,当将任务递归拆分为较小的任务时,ForkJoinPool是有效的。 题: 如果没有递归,偷窃工作是否仍可以在ForkJoinPool中进行? 在这种情况下值得吗? 更新1: 任务很小,可以不平衡。即使对于严格相等的任务,诸如上下文切换,线程调

  • 在< code > ForkJoinPool < code > ForkJoinTask 中,当前工作线程是否参与工作窃取? 我已经读到分叉连接池可以从阻塞或等待的线程中窃取的含义。目前的工人似乎是一个明显的候选人。一旦工作线程在另一个任务上调用 则该任务基本上被阻止。 另一方面,我看到许多暗示不同结论的文章。例如,当前工作线程应该在等待分叉任务之前完成工作的普遍共识。 有几篇文章讨论了使用作为一

  • 北京优锘科技有限公司 地址:北京市朝阳区酒仙桥路10号恒通国际商务园B23A 联系电话:400-666-9832 业务咨询:info@uino.com 售后服务:thingjs@uino.com