run()
является блокирующим вызовом и выполнит все возможные события перед возвратом. Он вернется, только если больше нет событий для обработки. Как только он вернется, вы должны вызвать reset()
на io_service перед повторным вызовом run()
.
Вы можете иметь несколько потоков, вызывающих run()
- это не проблема, и вам не нужен бесконечный цикл, если у io_service есть работа. Обычный шаблон для этого - создать work
объект на io_service, который заставит run()
никогда не возвращаться. Это означает, что вам явно нужно вызвать stop()
на io_service, когда вы закончите, поскольку он никогда не завершится естественным образом.
Если вы настроите work
на io_service, он никогда не выйдет естественным образом и, следовательно, вам никогда не потребуется вызывать reset()
.
work some_work(m_IoService); // this will keep the io_service live.
for( unsigned int i = 0; i < numThreads; ++i )
{
m_Threads.create_thread(
[&]()
{
m_IoService.run();
});
}
Теперь все потоки отправляют события на io_service
// Now post your jobs
m_IoService.post(boost::bind(...)); // this will be executed in one of the threads
m_IoService.post(boost::bind(...)); // this will be executed in one of the threads
m_IoService.post(boost::bind(...)); // this will be executed in one of the threads
m_IoService.stop(); // explicitly stop the io_service
// now join all the threads and wait for them to exit