Boost:: Asio: io_service.run() vs poll() или как интегрировать boost:: asio в mainloop
В настоящее время я пытаюсь использовать boost:: asio для некоторых простых tcp-сетей в первый раз, и я все уже сталкивался с чем-то, на чем я не уверен, как справиться. Насколько я понимаю, метод io_service.run() в основном представляет собой цикл, который выполняется до тех пор, пока больше нечего делать, что означает, что он будет работать до тех пор, пока я не выпущу свой маленький серверный объект. Поскольку у меня уже есть какой-то основной халат, я бы предпочел обновить сетевой цикл вручную оттуда только ради простоты, и я думаю, что io_service.poll() будет делать то, что я хочу, вроде как:
void myApplication::update()
{
myIoService.poll();
//do other stuff
}
Это похоже на работу, но мне все еще интересно, есть ли недостаток в этом методе, поскольку это, похоже, не является обычным способом работы с службами boost:: asios io. Является ли это допустимым подходом или я должен использовать io_service.run() в неблокирующем дополнительном потоке?
Ответы
Ответ 1
Использование io_service::poll
вместо io_service::run
вполне приемлемо. Разница объясняется в документации
Функция poll() также может быть использована для отправки готовых обработчиков, но без блокировки.
Обратите внимание, что io_service::run
будет блокироваться, если в очереди осталось work
Рабочий класс используется для информирования io_service, когда начинается работа и отделки. Это гарантирует, что Функция запуска() функции io_service не выйдет, пока идет работа, и что он выходит, когда нет незавершенная работа.
тогда как io_service::poll
не проявляет этого поведения, он просто вызывает готовые обработчики. Также обратите внимание, что вам нужно будет вызвать io_service:: reset при любом последующем вызове на io_service:run
или io_service::poll
.
Ответ 2
Недостатком является то, что вы сделаете цикл занятости.
while(true) {
myIoService.poll()
}
будет использовать 100% -ный процессор. myIoService.run()
будет использовать 0% cpu.
myIoService.run_one()
может делать то, что вы хотите, но он будет блокироваться, если ему нечего делать.