Какая хорошая реализация с открытым исходным кодом пула потоков для С++ для использования в производственном коде (что-то вроде boost)?
Просьба указать либо собственный код примера, либо ссылку на использование примера кода.
Какая хорошая реализация с открытым исходным кодом пула потоков для С++ для использования в производственном коде (что-то вроде boost)?
Просьба указать либо собственный код примера, либо ссылку на использование примера кода.
Я думаю, что он до сих пор не принят в Boost, но хороший взгляд: threadpool. Пример использования с веб-сайта:
#include "threadpool.hpp"
using namespace boost::threadpool;
// Some example tasks
void first_task()
{
...
}
void second_task()
{
...
}
void third_task()
{
...
}
void execute_with_threadpool()
{
// Create a thread pool.
pool tp(2);
// Add some tasks to the pool.
tp.schedule(&first_task);
tp.schedule(&second_task);
tp.schedule(&third_task);
// Leave this function and wait until all tasks are finished.
}
Аргумент "2" в пуле указывает количество потоков. В этом случае уничтожение tp
ожидает завершения всех потоков.
Возможно, вы захотите посмотреть http://threadpool.sourceforge.net/
Нетрудно реализовать пул потоков самостоятельно, используя Boost.Thread. В зависимости от задачи вы можете использовать lock-free контейнер для очереди вместо одного из Стандартная библиотека шаблонов. Например, fifo
контейнер из lock free
библиотека.
Удачи!
Я написал небольшой пример здесь. В основном вам нужно выполнить этот кусок кода:
asio::io_service io_service;
boost::thread_group threads;
auto_ptr<asio::io_service::work> work(new asio::io_service::work(io_service));
// Spawn enough worker threads
int cores_number = boost::thread::hardware_concurrency();
for (std::size_t i = 0; i < cores_number; ++i){
threads.create_thread(boost::bind(&asio::io_service::run, &io_service));
}
// Post the tasks to the io_service
for(vector<string>::iterator it=tasks.begin();it!=tasks.end();it++){
io_service.dispatch(/* YOUR operator()() here */);
}
work.reset();
Я считаю, что вы можете эмулировать пул потоков с помощью io_service в boost:: asio. Вы можете контролировать количество потоков, доступных для пула io_service, а затем вы можете "отправлять" задачи в io_service, который будет выполняться одним из потоков в пуле. Каждая такая задача должна быть функтором (я считаю).
Я не могу здесь привести пример, но в документации по asio в пулах io_service будет описано, как это можно сделать.
Вот простая очередь задач только для заголовка, использующая пул потоков (построенный на Boost): taskqueue.hpp
Страница TaskQueue содержит пример приложения, демонстрирующего как его использовать:
Эта библиотека основывается на Boost.Thread. Существует короткий короткий учебник с некоторым примером кода. Если это не делает то, что вы хотите, вы можете использовать его в качестве базовой линии.
Убедитесь, что вы используете версию Boost >= 1.37, если вы идете по этому маршруту.
Пример реализации с использованием ffead-cpp описывается . Он обеспечивает прямую, основанную на приоритетах, а также запланированную реализацию пула потоков. Проверьте это...