boost: реализация пула потоков asio для периодически синхронизируемых задач
У меня есть "главный" функция, которая выполняет множество небольших независимых задач, каждый раз за шаг. Однако после каждого временного шага я должен ждать выполнения всех задач, прежде чем идти вперед.
Я хочу сделать программу многопоточной. Я пробовал реализации с помощью Boost-OffShot Threadpool, и яя пробовал использовать вектор (общих указателей) потоков, и яМы испробовали идеи asio threadpool (используя io_service, налаживая некоторую работу, затем распределяя run для потоков и отправляя обработчики в io_service).
Похоже, что все это имеет много накладных расходов на создание и уничтожение тем для моего "много маленьких заданий " и мне нужен способ, предпочтительно с помощью инструментов asio, создать экземпляр одной io_service, одной thread_group, отправить обработчики в io_service и ждать одного временного шага »s работа должна быть закончена, прежде чем публиковать больше задач. Есть ли хороший способ сделать это? Вот's (урезанный) код для того, что я сейчас работаю:
boost::asio::io_service io_service;
for(int theTime = 0; theTime != totalTime; ++theTime)
{
io_service.reset();
boost::thread_group threads;
// scoping to destroy the work object after work is finished being assigned
{
boost::asio::io_service::work work(io_service);
for (int i = 0; i < maxNumThreads; ++i)
{
threads.create_thread(boost::bind(&boost::asio::io_service::run,
&io_service));
}
for(int i = 0; i < numSmallTasks; ++i)
{
io_service.post(boost::bind(&process_data, i, theTime));
}
}
threads.join_all();
}
Вот'что у меня было лучше (но нене знаю как реализовать)
boost::asio::io_service io_service;
boost::thread_group threads;
boost::asio::io_service::work work(io_service);
for (int i = 0; i < maxNumThreads; ++i)
{
threads.create_thread(boost::bind(&boost::asio::io_service::run,
&io_service));
}
for(int theTime = 0; theTime != totalTime; ++theTime)
{
for(int i = 0; i < numSmallTasks; ++i)
{
io_service.post(boost::bind(&process_data, i, theTime));
}
// wait here until all of these tasks are finished before looping
// **** how do I do this? *****
}
// destroy work later and join all threads later...