並行して実行したいいくつかのタスク (モンテカルロ シミュレーション) があるとします。特定の数のタスクを完了したいのですが、タスクによって時間がかかるため、作業をスレッドに均等に分割するのは簡単ではありません。また、最後にすべてのシミュレーションの結果を単一のベクトル (または配列) にする必要があります。
だから私は以下のアプローチを思い付きます:
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 を保護するミューテックスが必要ですか?