2012-04-30 17 views
0

私のプログラムでPPLがクラッシュする私は変数のいくつかがうまくいかないと思っています。 parallel_forの構築物についての私の構文はC++ PPL - ラムダ式とデータ共有

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

       // ... 

     } 

ある場合は、各スレッドはで動作するように、例えば、confciInputと式の独自のコピーを持っていますか?または、ラムダ式のキャプチャ句は、囲みスコープのローカル変数にのみアクセスできますか?

ありがとうございます。

答えて

2

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

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

への呼び出しを修正するが、任意の変更は、これらのスレッドは、これらのローカルコピーを作ることではないでしょう元の変数にする必要があります。

また、デフォルトでlambdaは変数をconst値で取得します。したがって、lamda内のいずれかの変数を変更する場合は、mutableの指定が必要です。

+0

ありがとうございますが、コンパイルはしていません。キャプチャ句の構文 '= confciInput'、' = formula'にエラーがあります。 – octoback

+0

@dlib構文を使いこなすと、値が – Praetorian

+0

である変数名だけを '='にする必要はなく、confciInputがクラスオブジェクトへのポインタであればどうなりますか?方法はありますか? – octoback