Доброго времени суток. Начинаю изучение параллельного программирования. Хотелось бы узнать как, к примеру, можно распараллелить заполнение одномерного массива, допустим случайными числами. При помощи QThread или QtConcurrent. Буду рад любому примеру.
Для поставленной задачи всё просто - делишь массив на кол-во блоков, равному количеству потоков, и в каждом потоке независимо заполняешь нужный блок. Примерно так:
C++ (Qt)
#include <QCoreApplication>
#include <QDebug>
#include <QVector>
#include <QtConcurrent>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QVector<int> vector;
// Для примера массив 10 миллионов значений
vector.resize(10000000);
QList<QFuture<void>> results;
for (int i = 0; i < 10; ++i) {
// Получаем указатель на нужный блок
int *data = vector.data() + i * 1000000;
// запускаем в отдельных потоках заполнялку, указываем лямбде адрес начала блока и его длинну
auto result = QtConcurrent::run([i](int *data, const size_t size) {
for (int i = 0; i < size; ++i) {
*(data++) = qrand();
}
// для отладки выводим на экран номер заполненного блока
qDebug() << i;
}, data, 1000000);
// нужно для ожидания окончания заполнения массива
results.append(result);
}
// ждем завершение заполнения массива
for (auto &f : results) {
f.waitForFinished();
}
qDebug() << "end";
return 0;
}