У меня есть "основная" функция, выполняющая множество небольших независимых задач каждый раз за каждый шаг времени. Однако после каждого шага времени я должен дождаться завершения всех задач перед тем, как сделать шаг вперед.
Я хочу сделать программу многопоточной. Я пробовал реализации с потоком потока boost-offshoot, и я попытался использовать вектор потоков (разделяемых указателей на), и я пробовал идеи asio threadpool (используя io_service, устанавливая некоторую работу, а затем распространяя запуск на потоки и проводки обработчиков в io_service).
Все из них, похоже, имеют множество накладных задач, создающих и уничтожающих потоки для моих "многих небольших задач", и я хочу, чтобы, предпочтительно, используя инструменты asio, создать экземпляр одного io_service, одного потока_группы, обработчиков проводки для io_service, и ожидание завершения одного рабочего шага, прежде чем отправлять больше заданий. Есть ли хороший способ сделать это? Здесь (урезанный) код для того, что я сейчас работаю:
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...