ForkJoinTask:join()-ing 的顺序
ForkJoinTask: Order of join()-ing
ForkJoinTask
的JavaDoc说:
[R]eturns (joins) should be performed innermost-first. For example, a.fork(); b.fork(); b.join(); a.join(); is likely to be substantially more efficient than joining a before b.
我不太明白为什么(以及在什么情况下)join()
的顺序很重要,假设我需要加入 a
和 b
并在继续我的计算之前得到他们的结果。
具体来说,我有几十个 fork()
ed 任务,我需要等待 所有 个任务 return 结果;很像 invokeAll()
会做的,但我仍然可以在 fork()
ing 之后但在 join()
ing 之前执行一些工作,所以我实现了类似 joinAll()
的东西,只有当我知道没有分叉任务的结果我无法继续。
问题是,这个joinAll()
应该怎么实现呢?此代码在任务上实际调用 join()
的顺序是否重要?
在为讲座准备 ForkJoin-Framework 时,我也在文档中偶然发现了这个语句,想知道为什么会这样。
首先,我想说明一下,对于您的问题,我没有明确的答案,但想分享一下我的发现:
在 Doug Lea (http://gee.cs.oswego.edu/dl/papers/fj.pdf) 撰写的原始论文中,他对工作窃取算法的实现在第 2.1 节:工作线程生成的子任务(使用 fork
) 被 推送到它们自己的双端队列 上。工作线程处理它们的 自己的双端队列 LIFO(最小优先),而工作线程从其他双端队列 FIFO(最老优先)窃取。
然后我认为重要的部分是:"When a worker thread encounters a join
operation, it processes other tasks, if available, until the target task is noticed to have completed (via isDone). All tasks otherwise run to completion without blocking."
因此,首先 join
处理 worker 自己接下来要处理的任务,而不是 join
执行可能从其他 worker 窃取的其他任务,效率更高。否则,由于潜在的上下文切换和锁争用,可能会有更多的线程管理开销。
至少对我来说,这个推理对于 JavaDoc 中的描述是有意义的。
ForkJoinTask
的JavaDoc说:
[R]eturns (joins) should be performed innermost-first. For example, a.fork(); b.fork(); b.join(); a.join(); is likely to be substantially more efficient than joining a before b.
我不太明白为什么(以及在什么情况下)join()
的顺序很重要,假设我需要加入 a
和 b
并在继续我的计算之前得到他们的结果。
具体来说,我有几十个 fork()
ed 任务,我需要等待 所有 个任务 return 结果;很像 invokeAll()
会做的,但我仍然可以在 fork()
ing 之后但在 join()
ing 之前执行一些工作,所以我实现了类似 joinAll()
的东西,只有当我知道没有分叉任务的结果我无法继续。
问题是,这个joinAll()
应该怎么实现呢?此代码在任务上实际调用 join()
的顺序是否重要?
在为讲座准备 ForkJoin-Framework 时,我也在文档中偶然发现了这个语句,想知道为什么会这样。
首先,我想说明一下,对于您的问题,我没有明确的答案,但想分享一下我的发现:
在 Doug Lea (http://gee.cs.oswego.edu/dl/papers/fj.pdf) 撰写的原始论文中,他对工作窃取算法的实现在第 2.1 节:工作线程生成的子任务(使用 fork
) 被 推送到它们自己的双端队列 上。工作线程处理它们的 自己的双端队列 LIFO(最小优先),而工作线程从其他双端队列 FIFO(最老优先)窃取。
然后我认为重要的部分是:"When a worker thread encounters a join
operation, it processes other tasks, if available, until the target task is noticed to have completed (via isDone). All tasks otherwise run to completion without blocking."
因此,首先 join
处理 worker 自己接下来要处理的任务,而不是 join
执行可能从其他 worker 窃取的其他任务,效率更高。否则,由于潜在的上下文切换和锁争用,可能会有更多的线程管理开销。
至少对我来说,这个推理对于 JavaDoc 中的描述是有意义的。