Использование пула потоков boost :: asio для задач общего назначения
Вэтот блог Я нашел довольно хороший пример того, как создать простой пул потоков с помощью boost :: asio. Я в основном хочу использовать это так:
#include <thread>
#include <functional>
#include <boost/asio.hpp>
int main ( int argc, char* argv[] ) {
asio::io_service io_service;
asio::io_service::work work(io_service);
std::vector<std::thread> threadPool;
for(size_t t = 0; t < std::thread::hardware_concurrency(); t++){
threadPool.push_back(thread(std::bind(&asio::io_service::run, &io_service)));
}
io_service.post(std::bind(an_expensive_calculation, 42));
io_service.post(std::bind(a_long_running_task, 123));
//Do some things with the main thread
io_service.stop();
for(std::thread& t : threadPool) {
t.join();
}
}
Насколько я знаю, Boost :: asio в основном предназначен для сетевого ввода-вывода. Тем не менее, я в основном хочу использовать его для функций общего назначения. Проблемы параллелизма будут решаться с использованиемasio::io_service::strand
.
Итак, мой вопрос: это хорошая идея для создания пула потоков, как это, даже если моя программа не использует сетевой ввод-вывод? Есть ли очевидные потери производительности по сравнению с другими реализациями пула потоков? Если так, то есть ли лучшие реализации, которые также так аккуратны?