2011-01-16 18 views
28

Actualmente estoy tratando de usar boost :: asio para algunas redes simples de tcp por primera vez, y ya me encontré con algo con lo que no estoy realmente seguro de cómo lidiar. Por lo que yo entiendo, el método io_service.run() es básicamente un bucle que se ejecuta hasta que no quede nada más por hacer, lo que significa que se ejecutará hasta que libere mi pequeño objeto de servidor. Como ya tengo algún tipo de configuración de mainloop, me gustaría actualizar el bucle de red manualmente desde allí simplemente por simplicidad, y creo que io_service.poll() haría lo que yo quisiera, algo como esto:Boost :: Asio: io_service.run() vs poll() o cómo puedo integrar boost :: asio en mainloop

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

Esto parece funcionar, pero todavía me pregunto si hay un inconveniente de este método, ya que no parece ser la forma más común de lidiar con los servicios boost :: asios io. ¿Es este un enfoque válido o debería usar io_service.run() en un hilo adicional que no bloquea?

Respuesta

37

El uso de io_service::poll en lugar de io_service::run es perfectamente aceptable. La diferencia se explica en la función documentation

La encuesta() también se pueden utilizar para enviar manipuladores listos, pero sin bloquear .

Tenga en cuenta que io_service::run bloqueará si hay alguna work la izquierda en la cola

La clase de trabajo es usado para informar al io_service cuando comience el trabajo y acabados. Esto garantiza que la función run() del objeto no saldrá mientras el trabajo está en curso, y que sale cuando no queda trabajo pendiente.

mientras que io_service::poll no muestra este comportamiento, solo invoca manejadores listos. También tenga en cuenta que deberá invocar io_service::reset en cualquier invocación posterior al io_service:run o io_service::poll.

+9

'io_service' no necesariamente se detiene después de que' io_service :: poll' devolvió. ¿Por qué necesita 'io_service :: reset' antes de' 'io_service :: run' o' io_service: poll'? – updogliu

2

Un inconveniente es que vas a hacer un ciclo ocupado.

while(true) { 
    myIoService.poll() 
} 

utilizará 100% cpu. myIoService.run() usará 0% de cpu.

myIoService.run_one() puede hacer lo que quiera pero se bloqueará si no hay nada que hacer.

+2

preferiría ejecutar en este caso simplista pero en la situación donde ya existe un bucle de evento (digamos que está haciendo renderización en segundo plano u otras cosas en ciclos de repuesto), la encuesta sería preferible ya que no desea que el juego se detenga cada vez que ejecuta run() bloquea. –