Я пишу программу Монте-Карло в C++ и использую std :: thread, чтобы разделить количество историй, которые нужно отслеживать между потоками. Тем не менее, это моя первая попытка многопоточности, и я столкнулся с проблемой, которую этот упрощенный код, надеюсь, позволит мне продемонстрировать в надежде, что я получу некоторые советы от читателей этого сайта. В этой упрощенной задаче я вызываю функцию Summation, которая производит 1X5 мерный массив случайных чисел с 2 потоками. Когда потоки возвращают свои значения (на самом деле не возвращаются, поскольку это глобальная переменная), основная программа затем имеет два массива с пятью размерами, каждый из которых соответствует другому потоку. Я хотел бы объединить два массива в один массив с элементами в конечном массиве, соответствующие сумме тех же элементов в двух массивах, которые были созданы разными потоками. К сожалению, массивы из каждого потока имеют одно и то же имя, поэтому я не могу просто добавить два разных массива. Какие методы рекомендуется объединить два массива размером 1X5 в единый массив суммирования с элементами, соответствующими сумме идентичных элементов из каждого потока?Объединение массивов из нескольких потоков с использованием std :: thread
#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
#include <cassert>
#include "boost/multi_array.hpp"
std::vector<float> Array;
std::mutex Array_mutex;
void Summation(int sample_size)
{
std::lock_guard<std::mutex> guard(Array_mutex);
for(int i = 0; i < sample_size; i++)
{
Array.push_back(rand() % 10 + 1);
}
std::cout << "\n";
}
int main(int argc, const char * argv[]) {
int sample_size = 10;
int Num_Threads = 2;
int number_count = sample_size/Num_Threads;
srand(time(NULL));
std::vector<std::thread> Threads;
for(int i = 0; i < Num_Threads; i++)
{
Threads.push_back(std::thread(Summation,number_count));
}
for(int i = 0; i < Num_Threads; i++)
{
Threads[i].join();
}
// - I would like to combine the arrays produced from each thread into a
// single array, where each element in the final array is the sum of
// the identical element in the array from each thread
// i.e. Element 1(final) = Element 1(thread 1) + Element 1(thread2)
// Element 2(final) = Element 2(thread 1) + Element 2(thread2)
// Element 3(final) = Element 3(thread 1) + Element 3(thread2)
return 0;
}
Две вещи: пусть каждый протектор выполняет немного вычислений, поэтому один поток выполняет записи с 1 по 10, еще 11-20 и т. Д. Если вектор создается с фиксированным размером (или если вы используете 'std :: array'), вам не нужна блокировка. Другое дело, инициализировать генератор случайных чисел * только один раз. –
Кроме того, вы не * имеете * несколько массивов (или векторов) для объединения в свой код, все потоки будут записываться в один и тот же массив. Фактически, пренебрегайте первой частью моего предыдущего комментария, так как ваша проблема - еще одна, и это значит, что у вас нет нескольких векторов, только один. –
O.K., это хорошая информация, которая меняет мое понимание вывода. Если это тот же массив, то это означает, что данные из одного потока перезаписывают данные, созданные вторым потоком, поэтому я получаю два массива, когда я печатаю их командой std :: cout, но на самом деле это один и тот же массив/слот памяти, напечатанный дважды с перезаписанными данными. Если это так, то как я могу получить каждый поток для создания отдельного массива, который может быть объединен в другой поток или главную программу? – Jon