Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 执行多线程的最佳方法是什么?_C++_Multithreading - Fatal编程技术网

C++ 执行多线程的最佳方法是什么?

C++ 执行多线程的最佳方法是什么?,c++,multithreading,C++,Multithreading,我有以下代码: for(int i=0;i<n;i++){ funcA(i); funcB(i); } for(inti=0;i从您提供的两种方法来看,第二种方法会更好 原因:第一种方法意味着您要让n线程来执行每个循环,而第二种方法是创建两个线程,并分配一个线程用于funcA,而另一个线程用于funcB。完成后,继续下一次迭代并重复。这是一个非常复杂的过程更好的方法因为您有两个线程朝着一个共同的目标工作,而不是n线程。从您提供的两种方法中,第二种会更好 原因:第一种方法意味着您要

我有以下代码:

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

for(inti=0;i从您提供的两种方法来看,第二种方法会更好


原因:第一种方法意味着您要让
n
线程来执行每个循环,而第二种方法是创建两个线程,并分配一个线程用于
funcA
,而另一个线程用于
funcB
。完成后,继续下一次迭代并重复。这是一个非常复杂的过程更好的方法因为您有两个线程朝着一个共同的目标工作,而不是
n
线程。

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


原因:第一种方法意味着您要让
n
线程来执行每个循环,而第二种方法是创建两个线程,并分配一个线程用于
funcA
,而另一个线程用于
funcB
。完成后,继续下一次迭代并重复。这是一个非常复杂的过程更好的方法是让两个线程朝着一个共同的目标工作,而不是
n
线程。

答案取决于函数是否相互依赖

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

但是,如果存在一些执行顺序依赖项,请小心。您可以使用互斥来避免一些问题,但最好是按顺序执行它们

编辑:正如您在评论中所述,
funcB(i)
的执行取决于
funcA(i)
,但是
{funcA(i);funcB(i)}
块是相互独立的


然后,通过将(0,n)范围划分为k个线程,您可以并行执行其中的多个线程。答案取决于函数是否相互依赖

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

但是,如果存在一些执行顺序依赖项,请小心。您可以使用互斥来避免一些问题,但最好是按顺序执行它们

编辑:正如您在评论中所述,
funcB(i)
的执行取决于
funcA(i)
,但是
{funcA(i);funcB(i)}
块是相互独立的


您可以通过将(0,n]范围划分为C++线程

来执行多个并行操作,您可能需要考虑TBB库(),它使用基于任务的并行性来解决个别迭代执行时间中可能存在的差异。 当必须用普通函子替换lambda时,也可以使用C++03。使用TBB,还可以将其编码为管道

或者,使用OpenMP,您的代码只需

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

对于(int i=0;i),您可能需要考虑TBB库(),它使用基于任务的并行性来解决个别迭代执行时间中可能存在的差异。C++代码看起来像这样(使用C++ 11)

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

或者,使用OpenMP,您的代码只需

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


对于(int i=0;iYou忘记了
funcB(i)
的分号。正如标题:小心!@g-makulik:让我想起了Tom Lehrer:看看OpenMP。如果您的平台支持它,可能会为您节省大量时间和麻烦;也很好/很容易尝试不同的策略。您忘记了
funcB(i)的分号
。正如标题:小心!@g-makulik:让我想起了Tom Lehrer:看看OpenMP。如果您的平台支持它,可能会为您节省大量时间&麻烦;尝试不同的策略也很好/容易。funcB取决于funcAIn我的意见,顺序执行会更好,因为它会节省一些同步开销。我这是一个图像分析程序,我需要加速执行,正如我所说的,如果funcB的执行依赖于funcA的结果,则不能使用第二种方法进行并行化。但是,如果可以执行thread1={funcA(1);funcB(1)}和thread2={funcA(2);funcB(2)}在任何顺序中,然后尽一切可能使用这种并行化方法。正如我所说,如果funcB的执行取决于funcA的结果,则不能使用第二种方法进行并行化。错误。这是可能的,只要数据按顺序处理。这称为管道,是典型的数据处理。funcB依赖于funcAIn my这样看来,顺序执行会更好,因为它会节省一些同步开销。这是一个图像分析程序,我需要加速执行。正如我所说,如果funcB的执行取决于funcA的结果,则不能使用第二种方法进行并行。但是,如果可以执行say thread1={funcA(1);funcB(1)}和thread2={funcA(2);funcB(2)}以任何顺序,然后无论如何,使用这种并行化方法。正如我所说,如果funcB的执行取决于funcA的结果,则不能使用第二种方法进行并行化。错误。这是可能的,只要数据按顺序处理。这称为管道,是典型的数据处理。我不使用n个线程来执行每个循环。我说每个线程执行[0,n]的子范围。我没有让n个线程执行每个循环。我说每个线程执行[0,n]的子范围
#pragma omp parallel for
for(int i=0;i<n;++i) {
  funcA(i);
  funcB(i);
}