假设我有一些要并行运行的任务(蒙特卡洛模拟)。我想完成给定数量的任务,但任务需要不同的时间,所以不容易在线程上平均分配工作。另外:我最终需要单个向量(或数组)中的所有模拟结果。
所以我想出了以下方法:
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.
}
我猜上面的代码会给出竞争条件。我正在寻找一种高效的方法来避免这种情况。要求:避免竞争条件(填满整个数组,没有跳过);最终结果立即在数组中;高性能。
阅读各种方法,似乎 atomic 是一个不错的选择,但我不确定在我的情况下哪些设置最有效?甚至不确定 atomic 是否会削减它;也许需要一个保护 LastAdded 的互斥锁?