Boost :: Asio: io_service.run () против poll () или как интегрировать boost :: asio в mainloop - PullRequest
30 голосов
/ 16 января 2011

В настоящее время я впервые пытаюсь использовать boost :: asio для некоторых простых tcp-сетей, и я уже столкнулся с чем-то, с чем я не совсем уверен, как справиться.Насколько я понимаю, метод io_service.run () - это, по сути, цикл, который выполняется до тех пор, пока больше ничего не остается, что означает, что он будет работать до тех пор, пока я не освобождаю свой маленький серверный объект.Так как у меня уже есть какая-то настройка mainloop, я бы предпочел обновить оттуда сетевой цикл вручную просто ради простоты, и я думаю, что io_service.poll () будет делать то, что я хочу, примерно так:

void myApplication::update()
{
     myIoService.poll();
     //do other stuff
}

Кажется, это работает, но мне все еще интересно, есть ли недостаток у этого метода, поскольку он, похоже, не является обычным способом работы с сервисами boost :: asios io.Это правильный подход или лучше использовать io_service.run () в неблокирующем дополнительном потоке?

Ответы [ 2 ]

40 голосов
/ 16 января 2011

Использование io_service::poll вместо io_service::run вполне приемлемо.Различие объясняется в документации

Функция poll () может также использоваться для отправки готовых обработчиков, но без блокировки.

Примечаниеio_service::run будет блокироваться, если в очереди останется work

Рабочий класс используется для информирования io_service о начале и завершении работы.Это гарантирует, что функция run () объекта io_service не выйдет, когда работа ведется, и что она завершится, если не осталось незавершенной работы.он просто вызывает готовые обработчики.Также обратите внимание, что вам нужно будет вызывать io_service :: reset при любом последующем вызове io_service:run или io_service::poll.

2 голосов
/ 09 сентября 2014

Недостатком является то, что вы сделаете занятый цикл.

while(true) {
    myIoService.poll()
}

будет использовать 100% процессора. myIoService.run() будет использовать 0% процессора.

myIoService.run_one() может делать то, что вы хотите, но он будет блокироваться, если ему нечего делать.

...