0

PPL を使用した私のプログラムがクラッシュします。変数の一部の誤った共有が疑われます。parallel_for コンストラクトの構文が

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

                 // ...

      }

、各スレッドには、たとえば操作するための confciInput と式の独自のコピーがありますか? それとも、ラムダ式のキャプチャ句は、囲んでいるスコープのローカル変数へのアクセスのみを提供しますか?

ありがとうございます。

4

1 に答える 1

2

ラムダ式のキャプチャリストで参照によって変数をキャプチャすると、各スレッドはキャプチャされたのと同じ変数で動作し、この変数の値は呼び出し元のコンテキストで変更されます。各スレッドに独自のコピーが必要な場合は、呼び出しを変更してください

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

confciInput現在、各スレッドには変数と変数の独自のコピーがありformulaますが、これらのスレッドがこれらのローカルコピーに加える可能性のある変更は、元の変数には行われません。

また、デフォルトでは、ラムダはconst値で変数をキャプチャするため、ラムダ内の変数のいずれかを変更する場合は、指定が必要になりますmutable

于 2012-04-30T15:04:32.833 に答える