0

我有以下代码:

for(int i=0;i<n;i++){
  funcA(i);
  funcB(i);
}

我想使用多线程来实现它,我认为有两种方法可以做到这一点(在这两种方法中,每个线程都采用 [0, n] 的子范围):

1)创建一个执行这两个函数的线程类。

2)创建两个线程类:第一个执行funcA(),第二个执行funcB(),比如每个都有自己的循环,像这样:

for(int i=0;i<n;i++){
  funcA(i);
}

for(int i=0;i<n;i++){
  funcB(i);
}

哪一个是最好的?还是它们等效?

4

3 回答 3

3

答案取决于功能是否相互依赖。

如果一个的执行不依赖于任何受另一个影响的变量,您可以自由甚至鼓励在单独的线程中执行这两个函数。

但是如果有一些执行顺序依赖,请注意。您可以使用互斥锁来避免一些问题,但顺序执行它们可能会更好。

编辑:正如您在评论中所说,执行funcB(i)取决于funcA(i),但是{funcA(i); funcB(i)}块彼此独立。

然后,您可以通过将 (0,n] 范围划分为 k 个线程来并行执行其中的多个

于 2013-08-11T15:07:15.787 回答
2

您可能需要考虑 TBB 库 ( http://threadingbuildingblocks.org/ ),它使用基于任务的并行性来平衡各个迭代的执行时间可能存在的差异。您的代码看起来像这样(使用 C++11)

tbb::parallel_for(0,n,[](int i){
  funcA(i);
  funcB(i);
});

当您必须用普通函子替换 lambda 时,您也可以使用 C++03。使用 TBB,您还可以将其编码为管道。

或者,使用 OpenMP,您的代码很简单

#pragma omp parallel for
for(int i=0;i<n;++i) {
  funcA(i);
  funcB(i);
}

但这需要您的编译器支持 OpenMP(clang 不支持),这与 C++11 不兼容。

于 2013-08-11T16:30:08.720 回答
1

从您提供的两种方法中,第二种方法会更好。

原因:第一种方法意味着您正在创建n线程来执行每个循环,而第二种方法是创建两个线程并分配一个来工作,funcA而另一个词 on funcB。然后一旦他们完成,继续下一次迭代并重复。这是一种更好的方法,因为您有两个线程朝着共同的目标而不是n线程工作。

于 2013-08-11T15:05:25.503 回答