分而治之的差异与分叉和加入

时间:2015-04-16 22:17:11

标签: c++ parallel-processing language-agnostic divide-and-conquer fork-join

在C ++中,分而治之间的区别是什么?分叉加入?是fork并加入一个特殊的分而治之的例子,因为fork和join只适用于并行性?谢谢!

2 个答案:

答案 0 :(得分:2)

“分而治之”是一种通用的编程方法,可以将更大的问题分解为更可解的子问题,单独解决它们(有时是递归地),最后通过结合子问题的答案来解决大问题。这是一个不特定于C ++的想法。

“Fork”和“Join”命名特定的并行原语,可用于多种语言。 “Fork”导致另一个执行线程被启动; “join”导致当前线程等待另一个线程完成并同步。我相信C ++ 14标准内置了这样的原语。许多其他langauges没有这种内置功能,但它通常可以通过库(包括早期版本的C ++)获得。

有人可能会使用“Fork”和“Join”来实现并行性增强的“分而治之”。像这样使用,“fork”将线程发送到单独的子项,并且“join”是表示子问题完成信号的步骤。但“加入”并不专门计算“大”问题的综合答案。您可能需要更多代码,而不仅仅是fork和join。

答案 1 :(得分:1)

基本上,Fork-Join将手头的任务分解为迷你任务,直到迷你任务足够简单,无需进一步分解即可解决。这就像一个分而治之的算法。在此框架中需要注意的一个重要概念是理想情况下没有工作线程处于空闲状态。他们实施了一种窃取工作的算法,因为闲置的工作人员从那些忙碌的工人那里偷走了工作。

  Result solve(Problem problem) 
  {
        if (problem is small)
            directly solve problem
        else 
             {
            split problem into independent parts
            fork new subtasks to solve each part
            join all subtasks
            compose result from subresults
          }
  }

C ++ 14有一些与fork& amp相关的问题。加入,您可以从此网站(http://www.meetingcpp.com/index.php/br/items/a-look-at-c14-papers-part-2.html

了解更多信息