c++ networking tcp boost-asio

c++ - Boost:: Asio: io_service.run() vs poll() o cómo puedo integrar boost:: asio en mainloop



networking tcp (2)

Un inconveniente es que harás un bucle ocupado.

while(true) { myIoService.poll() }

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

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

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 de forma manual a partir de allí solo por simplicidad, y creo que io_service.poll () haría lo que yo quisiera, más o menos así:

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?


Usar io_service::poll lugar de io_service::run es perfectamente aceptable. La diferencia se explica en la documentation

La función poll () también se puede usar para despachar manejadores listos, pero sin bloquear.

Tenga en cuenta que io_service::run bloqueará si queda work en la cola

La clase de trabajo se usa para informar al io_service cuando el trabajo comienza y termina. Esto garantiza que la función run () del objeto io_service no se cerrará mientras el trabajo está en curso, y que saldrá cuando no quede trabajo sin terminar.

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 a io_service:run o io_service::poll .