Как я могу синхронизировать свой пул потоков с моим основным потоком, не добавляя такой большой задержки?C++

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

Сообщение Гость »


Итак, у меня есть программа, которая выполняет некоторые математические операции, выполнение которых занимает некоторое время. После завершения вычислений мне нужно суммировать результаты в контейнер, а затем записать окончательные результаты в файл. Теперь это может стать очень медленным, если я увеличу количество итераций вычислений, поэтому я добавил пул потоков, в котором я отправляю задачи в очередь, а затем каждый поток пула потоков возьмет задачу и выполнит ее. Эта реализация очень похожа на ту, что показана в книге «Валюта C++ в действии».

Проблема, с которой я столкнулся, заключается в том, что когда пул потоков выполняет вычисления на основе отправленной задачи, мне нужно заставить основной поток ждать, пока пул потоков завершит вычисление, что приводит к тому, что программа работает намного медленнее, чем ее выполнение. без использования пула потоков. Проблема, похоже, в Future.wait(), которая делает программу намного медленнее. Дело в том, что мне нужно дождаться готовности будущего, прежде чем переходить к нормальному выполнению программы.

Вот пример того, как выглядит код. Это не настоящий код, но он иллюстрирует концепцию, с которой у меня возникли проблемы.
void do_some_computation(std::vector& results){...} void sum_samples(std::vector& результаты){...} void write_into_file(std::vector& результаты){...} интервал основной() { const size_t num_threads = std::thread::hardware_concurrency(); ThreadPool thread_pool (num_threads); std::vector& результаты; std::vector фьючерсы; // Отправляем некоторые задачи в пул потоков для (int я = 0; я < 100; ++i) { std::future fut = thread_pool.submit([i,&results] { do_some_computation (результаты); }); Futures.push_back(std::move(fut)); } // Продолжаем обработку, как только какая-либо задача завершится for (авто и будущее: фьючерсы) { будущее.ожидание(); std::cout
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ, комментарий, отзыв

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

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

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

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

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