0

並行して実行したいいくつかのタスク (モンテカルロ シミュレーション) があるとします。特定の数のタスクを完了したいのですが、タスクによって時間がかかるため、作業をスレッドに均等に分割するのは簡単ではありません。また、最後にすべてのシミュレーションの結果を単一のベクトル (または配列) にする必要があります。

だから私は以下のアプローチを思い付きます:

 int Max{1000000};
 //SimResult is some struct with well-defined default value.
 std::vector<SimResult> vec(/*length*/Max);//Initialize with default values of SimResult
 int LastAdded{0};
 void fill(int RandSeed)
 { 
      Simulator sim{RandSeed};
      while(LastAdded < Max)
      {
           // Do some work to bring foo to the desired state
           //The duration of this work is subject to randomness
           vec[LastAdded++] 
                 = sim.GetResult();//Produces SimResult. 
      }
 }
 main()
 { 
       //launch a bunch of std::async that start
       auto fut1 = std::async(fill,1);
       auto fut2 = std::async(fill,2);
       //maybe some more tasks.


      fut1.get();
      fut2.get();
      //do something with the results in vec. 
 }

上記のコードは、私が推測する競合状態を引き起こします。それを回避するためのパフォーマンスの高いアプローチを探しています。要件: 競合状態を回避します (配列全体を埋める、スキップしない)。最終結果はすぐに配列になります。パフォーマンス。

さまざまなアプローチを読んで、アトミックが良い候補のようですが、私の場合、どの設定が最もパフォーマンスが高いかわかりませんか? そして、アトミックがそれをカットするかどうかさえわかりません。おそらく、LastAdded を保護するミューテックスが必要ですか?

4

2 に答える 2