2017-09-18 16 views
-1

関数が一度forループ内のC++マルチスレッドは機能しませんか?以下

(A)

for (i = 0; i < 5; i=i+1) 
     multiplicationTask[i] = thread([&] { slice3.push_back(multiParallel(slice1[i], slice2[i])); }); 

を使用して複数のスレッド上で実行し、(B)

multiplicationTask[0] = thread([&] { slice3.push_back(multiParallel(slice1[0], slice2[0])); }); 
    multiplicationTask[1] = thread([&] { slice3.push_back(multiParallel(slice1[1], slice2[1])); }); 
    multiplicationTask[2] = thread([&] { slice3.push_back(multiParallel(slice1[2], slice2[2])); }); 
    multiplicationTask[3] = thread([&] { slice3.push_back(multiParallel(slice1[3], slice2[3])); }); 
    multiplicationTask[4] = thread([&] { slice3.push_back(multiParallel(slice1[4], slice2[4])); }); 

両方のアプローチが実行されるが、これを使用して、コードの一部であります最初は誤った値を返します。どうして?

+0

'' @lice3'の 'push_back'がスレッドセーフでない限り、この方法で使うのは間違っています – LWimsey

答えて

4

参考資料としてiをキャプチャしています。各スレッドが起動するまでに、iはすでに値を変更しているか、範囲外になっている可能性があります。値でそれをキャプチャします。

一般的には、「すべてを参照で取得する」とマルチスレッドには注意が必要です。何をしているのか分からない場合は間違っている可能性があります。一般的に、私はキャプチャリストを明示的に指定して、キャプチャしているものが何であるかを確認します。何が起こるかslice3.push_backはスレッドセーフではありません(とstd::vectorpush_backはスレッドセーフではない)場合

また、として正しく両方のケースでは、@LWimseyによって指摘は誰の推測です - あなたも完全にslice3で終わる可能性矛盾した状態。

+0

@VahidGhorbanian:正直なところ、値でキャプチャしてキャプチャを把握していないと、ラムダを使って(1)、マルチスレッドで(2)ベンチャーをする前にそれを勉強してください。 –

関連する問題