2011-01-16 2 views
28

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

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

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

ответ

37

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

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

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

Класс работы используется для информирования io_service, когда работа начинается и заканчивается . Это гарантирует, что функция запуска io_service функции ( не будет выходить во время работы, и что она завершает работу, если нет оставшихся незавершенных работ.

io_service::poll не имеет такого поведения, он просто вызывает готовые обработчики. Также обратите внимание, что вам нужно будет вызывать io_service::reset при любом последующем вызове до io_service:run или io_service::poll.

+9

'io_service' не обязательно останавливается после возврата' io_service :: poll'. Зачем нужно 'io_service :: reset' перед последующим' io_service :: run' или 'io_service: poll'? – updogliu

2

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

while(true) { 
    myIoService.poll() 
} 

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

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

+2

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