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...

Ответы на вопрос(3)

Ваш ответ на вопрос