В этот блог Я нашел довольно хороший пример того, как создать простой пул потоков с помощью 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
,
Итак, мой вопрос: это хорошая идея для создания пула потоков, как это, даже если моя программа не использует сетевой ввод-вывод? Есть ли очевидные потери производительности по сравнению с другими реализациями пула потоков? Если так, то есть ли лучшие реализации, которые так же аккуратны?
Boost.Asio не только для сетевого программирования, см. справочная документация. Он имеет обширную поддержку для таких вещей, как
deadline_timer
)Я использовал его для других целей в нескольких приложениях. Одним из примеров является пул потоков для обслуживания потенциально долго выполняющихся блокирующих операций базы данных при одновременном предоставлении асинхронного интерфейса для приложения. Boost.Asio действительно очень мощная библиотека. Использование его для общего пула потоков, как вы предлагаете, может работать просто отлично.
Я не вижу причин, чтобы не делать такие вещи. В качестве преимущества вы можете использовать такие вещи, как таймеры дедлайна, которые построены на основе boost :: asio.
Я написал класс ThreadPool с boost asio. Работает и чисто &достаточно ясно, чтобы понять легко. ThreadPool с надписью asio