Как я могу синхронизировать свой пул потоков с моим основным потоком, не добавляя такой большой задержки? ⇐ 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
Итак, у меня есть программа, которая выполняет некоторые математические операции, выполнение которых занимает некоторое время. После завершения вычислений мне нужно суммировать результаты в контейнер, а затем записать окончательные результаты в файл. Теперь это может стать очень медленным, если я увеличу количество итераций вычислений, поэтому я добавил пул потоков, в котором я отправляю задачи в очередь, а затем каждый поток пула потоков возьмет задачу и выполнит ее. Эта реализация очень похожа на ту, что показана в книге «Валюта 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
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как я могу генерировать исключения CHECKED из лямбда-потоков/потоков Java 8?
Гость » » в форуме JAVA - 0 Ответы
- 16 Просмотры
-
Последнее сообщение Гость
-