Задать вопрос
DanielDemidko
@DanielDemidko
Программист

Как выполнить одну функцию для всех элементов вектора одновременно?

Есть vector<T> vec, функцияbool f(T).
Хочу выполнить функцию f для каждого элемента в vec, и сохранить все результаты вvector<bool> res;
Это можно сделать циклом
for(auto &i: vec)
{
    res.push_back(f(i));
}

Но я хочу распараллелить выполнение функции f для каждого элемента с помощью C++ threads/future
Функция f является чистой.
  • Вопрос задан
  • 144 просмотра
Подписаться 1 Простой 2 комментария
Решения вопроса 2
https://en.cppreference.com/w/cpp/experimental/par...
https://github.com/intel/parallelstl/blob/master/R...
OpenMP
Из коробки естественно ничего нет подходящего.
Ответ написан
Комментировать
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Вам уже написали выше, как это реализовать с помощью стандартной библиотеки (правда пока это ещё не часть стандарта, насколько мне известно).
В вашем случае, алгоритм будет такой:
1) Узнать число доступных потоков https://en.cppreference.com/w/cpp/thread/thread/ha...
2) Развить массив на столько частей, сколько у вас есть потоков
3) Написать функцию, которая принимает, скажем два итератора на часть массива, которую необходимо обработать, и два итератора на массив с результатами
4) Создать необходимое количество потоков https://en.cppreference.com/w/cpp/thread/thread/thread (число было получено в пункте 1) и запустить в них функции.
5) Дождаться результатов завершения: https://en.cppreference.com/w/cpp/thread/thread/join

Для этого можно использовать и std::async (https://en.cppreference.com/w/cpp/thread/async). Он возвращает std::future (https://en.cppreference.com/w/cpp/thread/future), на этом объекте необходимо будет ждать результатов вычисления.

Хотелось бы ещё отметить, что возможно не имеет смысла параллелить обработку небольших массивов, это только замедлит программу.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы