0

我的 PPL 程序崩溃了。我确实怀疑一些变量处理不当。如果我的 parallel_for 构造语法是

parallel_for(0,p,[&x1Pt,&x2Pt,&confciInput,&formula,&param,&method,&lowOneParam,&highOneParam](int i)
{   

                 // ...

      }

,是否每个线程都有自己的 confciInput 和公式副本,例如,可以使用?还是 lambda 表达式的捕获子句仅提供对封闭范围局部变量的访问?

谢谢并恭祝安康。

4

1 回答 1

2

当您在 lambda 表达式的捕获列表中通过引用捕获变量时,每个线程将对捕获的同一个变量进行操作,并且该变量的值在调用者的上下文中被修改。如果您需要每个线程都有自己的副本,请将调用修改为

parallel_for(0,p,
  [&x1Pt,&x2Pt,confciInput,formula,&param,&method,&lowOneParam,&highOneParam]
  (int i) mutable
{   
  // ...
} );

现在,每个线程都有自己的confciInputformula变量副本,但是这些线程可能对这些本地副本进行的任何修改都不会对原始变量进行。

此外,默认情况下,lambda 通过 const 值捕获变量,因此如果您要修改 lamda 中的任一变量,则需要mutable规范。

于 2012-04-30T15:04:32.833 回答