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() может делать то, что вы хотите, но он будет блокироваться, если ему нечего делать.