Как правильно использовать настройки пула потоков для io_service? Эти 2 оператора из документации сбивают меня с толку:
Обычный выход из функции run () подразумевает, что объект io_service остановлен (функция Stop () возвращает правда). Последующие вызовы run (), run_one (), poll () или poll_one () вернутся немедленно, если не было предыдущего вызова 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 ()
в бесконечный цикл (что, по-видимому, указывает в документации, не должно быть в случае). Какой правильный способ?