Как позволить разным потокам заполнять массив вместе?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как позволить разным потокам заполнять массив вместе?

Сообщение Anonymous »

Предположим, у меня есть несколько задач (моделирование Монте-Карло), которые я хочу выполнять параллельно. Я хочу выполнить определенное количество задач, но задачи занимают разное количество времени, поэтому нелегко разделить работу поровну по потокам. Также: в конечном итоге мне нужны результаты всех симуляций в одном векторе (или массиве).

Итак, я придумал следующий подход:

Код: Выделить всё

 int Max{1000000};
//SimResult is some struct with well-defined default value.
std::vector 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?

Подробнее здесь: https://stackoverflow.com/questions/606 ... y-together
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»