forkjoin并发框架—需求背景和设计原理

本文介绍了ForkJoin框架的设计理念,其核心在于通过分而治之的方式将任务分解成多个子任务并行处理,最终合并结果。文章强调了ForkJoin在设计时需要考虑的要点,包括线程管理、队列机制以及工作窃取等策略,并讨论了相关的数据结构支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Fork Join 的设计简介

看过《Introduction to Algorithms》(《算法导论》)的朋友们应该还记得,在讲到归并排序(Merge Sort)和快速排序的时候,有一种很简单又很有效率的思路就是“分而治之”,即“分治法”。而Fork Join的思路也是同理,只不过划分之后的任务更适合分派给不同的计算资源,可以并行的完成任务。
这里写图片描述
当计算分别完成之后,最后再合并回来。

简单来看,就是一个递归的分解和合并,直到任务小到可以接受的程度。

2. Fork Join 设计要点

Fork Join设计出来就是为了提高任务完成的效率,围绕这个目标,有一些要点是设计中需要考虑的,下面就给出一些要点。

线程的管理和线程的单纯性。基于如上的设计思路,我们可以看到子任务之间的相关性是相对比较简单的,可以并行处理。为了提高效率,并不需要重量级的线程结构和对应的线程维护,线程实现简单就好,满足需求即可,降低维护成本。

队列机制,硬件支持一定是比较有限的,那么分解的任务应该用队列维护起来,一个好的队列设计是很有必要的。

工作窃取”,也就是设计论文原文中提到的 Work Stealing 。对于负载比较轻的线程,可以帮助负载较重的执行线程分担任务。

对于使用Fork Join的开发者来讲,需要注意:

可用线程数和硬件支持。线程这东西,也是有开销的东西,绝对不是越多越好,尤其在硬件基础有限的情况下。

任务分解的粒度。和前者有关系,就是分解的任务,“小”到什么程度是可以接受的,不可再分。

3. Fork Join数据结构支持

按照如上设计,分解执行一个大的任务,Fork Join至少需要考虑如下一些数据结构。

  • 轻量级的线程结构。
  • 维护线程的线程池,负责线程的创建,数量维护和任务管理。维护任务,并支持Work Stealing的双端队列。
    如下图。
    这里写图片描述
    对于子任务的分解,可以从base端取出分解再放入,而对于WorkStealing则可以从top端取出,放入其他队列的尾部。

原文链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值