Какое правильное использование настроек пула потоков для io_service? Эти 2 заявления из документации отбрасывают меня:
io_service:: run
Нормальный выход из функции run() означает, что объект io_service остановлен (функция stop() возвращает true). Последующие вызовы run(), run_one(), poll() или poll_one() будут немедленно возвращены, если не был предыдущий вызов reset().
io_service:: reset
Эта функция должна быть вызвана до любого второго или более позднего набора вызовов функций run(), run_one(), poll() или poll_one(), когда предыдущий вызов этих функций возвращался из-за остановки io_service или заканчивается работа.
Вот что я сейчас делаю:
boost::thread_group m_Threads;
boost::asio::io_service m_IoService;
boost::barrier m_Barrier(numThreads);
for( unsigned int i = 0; i < numThreads; ++i )
{
m_Threads.create_thread(
[&]()
{
for(;;)
{
m_IoService.run();
if( m_Barrier.wait() ) // will only return true for 1 thread
{
m_IoService.reset();
}
m_Barrier.wait();
}
});
}
m_IoService.stop();
m_Threads.interrupt_all();
m_Threads.join_all();
Кажется, что все работает нормально, если я просто помещаю m_IoService.run()
в бесконечный цикл (который, как представляется, указывает на документацию, не должно быть). Каков правильный путь?