繁体   English   中英

有关 Fork-Join 框架的详细信息

[英]A detail about the Fork-Join Framework

在 Doug Lea 的论文“A Java Fork/Join Framework”中:

http://gee.cs.oswego.edu/dl/papers/fj.pdf

在 2.1 Work-Stealing 中他说:

当工作线程遇到连接操作时,它会处理其他任务(如果可用),直到注意到目标任务已完成(通过 isDone)。 否则,所有任务都会在不阻塞的情况下运行至完成。

那么谁能具体告诉我这些“其他任务”是从哪里来的呢? 它们来自其他工作线程的任务队列吗? 这是否意味着每当工作线程遇到连接调用时,它就会继续“从其他线程窃取任务”而不是“跳到自己队列中的其他任务”?

当有待处理任务时,“其他任务”可能来自它自己的双端队列,其他线程的双端队列,或者来自新请求的提交队列。

join() 是一个相当困难的过程。 它涉及到任务控制,即在任务处于活动处理和暂停等待状态时能够控制任务。 在应用程序中这样做通常是行不通的。 (操作系统做得很好,Cilk、JCilk 通过使用编译器/运行时来做到这一点。)Doug Lea 在连接陷入工作线程时使用“延续线程”。

Fork / Join框架中的每个工作线程都有一个工作队列,使用Deque实现。

每次创建新任务(或子任务)时,都会将其推送到自己的队列的头部。 当任务完成任务并与尚未完成的另一个任务执行连接时,它会很智能。 线程从其队列的头部弹出一个新任务并开始执行而不是休眠(为了等待另一个任务完成)。 实际上,如果线程的队列为空,则线程从属于另一个线程的队列的尾部弹出一个任务。 这只不过是一种偷工作的算法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM