Использование пула потоков 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,

Итак, мой вопрос: это хорошая идея для создания пула потоков, как это, даже если моя программа не использует сетевой ввод-вывод? Есть ли очевидные потери производительности по сравнению с другими реализациями пула потоков? Если так, то есть ли лучшие реализации, которые так же аккуратны?

9

Решение

Boost.Asio не только для сетевого программирования, см. справочная документация. Он имеет обширную поддержку для таких вещей, как

  • основанные на времени операции (deadline_timer)
  • обработка сигналов
  • специфичные для платформы операции, такие как потоки posix и дескрипторы Windows

Я использовал его для других целей в нескольких приложениях. Одним из примеров является пул потоков для обслуживания потенциально долго выполняющихся блокирующих операций базы данных при одновременном предоставлении асинхронного интерфейса для приложения. Boost.Asio действительно очень мощная библиотека. Использование его для общего пула потоков, как вы предлагаете, может работать просто отлично.

6

Другие решения

Я не вижу причин, чтобы не делать такие вещи. В качестве преимущества вы можете использовать такие вещи, как таймеры дедлайна, которые построены на основе boost :: asio.

3

Я написал класс ThreadPool с boost asio. Работает и чисто &достаточно ясно, чтобы понять легко. ThreadPool с надписью asio

2
По вопросам рекламы [email protected]