代码之家  ›  专栏  ›  技术社区  ›  JimmyB

forkjointask:join()的顺序

  •  0
  • JimmyB  · 技术社区  · 7 年前

    这个 JavaDoc 属于 ForkJoinTask 说:

    [R]eturns(joins)应该首先在最里面执行。例如,a.fork();b.fork();b.join();a.join();可能比在b之前加入a更有效。

    我不太明白为什么 join() S很重要,假设我需要加入 a b 在继续我的计算之前得到他们的结果。

    具体来说,我有几打 fork() Ed任务和我需要等待 全部的 以回报他们的结果;很像 invokeAll() 可以,但我可以在 Frk() 但是之前 连接() 所以我实现了一个 joinAll() 只有当我知道如果没有分叉任务的结果,我就无法继续时才被调用。

    问题是,这应该如何 连接() 是否实施?这段代码实际调用的顺序是否重要 连接() 在任务上?

    1 回复  |  直到 7 年前
        1
  •  1
  •   rlight    7 年前

    在为演讲准备forkjoin框架时,我在文档中偶然发现了这一点,并想知道为什么会这样。

    首先,我想指出,我对你的问题没有明确的答案,但我想分享我的发现:

    在道格·利亚的原著中( http://gee.cs.oswego.edu/dl/papers/fj.pdf ,第2.1节:工作线程生成的子任务(使用 fork 被推到他们自己的身上 . 工作线程处理 拥有后进先出权 (最年轻的优先),而工人从其他德克斯先进先出(最老的优先)。

    我认为最重要的是:“当一个工作线程遇到 join 操作, 它处理其他任务 ,如果可用, 直到目标任务被发现 完成(通过isdone)否则,所有任务都将在不阻塞的情况下运行到完成。”

    因此,首先 参加 关于工人自己将处理的下一个任务,而不是 参加 从事其他可能被其他工人偷走的工作。否则,由于潜在的上下文切换和锁争用,可能会有更多的线程管理开销。

    至少对我来说,这个推理对于javadoc中的描述是有意义的。

    推荐文章