c++ boost boost-asio

c++ - Clear boost:: asio:: io_service after stop()



boost-asio (1)

io_service::stop() y io_service::reset() solo controlan el estado del bucle de eventos de io_service ; ni afectan la vida útil de los controladores programados para la invocación diferida (lista para ejecutar) o los objetos del manejador definidos por el usuario.

El destructor para io_service hará que se io_service todos los controladores excepcionales:

  • Cada objeto de servicio asociado con io_service tendrá invocada su función de miembro shutdown_service() . Según el requisito de Tipo de servicio , la función de miembro shutdown_service() destruirá todas las copias de los objetos del manejador definidos por el usuario que están en poder del servicio.
  • Los objetos del manejador no invocados programados para la invocación diferida se destruyen para el io_service y cualquiera de sus hilos.

Considere lo siguiente:

  • Controlar la vida útil del objeto io_service . Un enfoque se puede encontrar en esta respuesta.
  • Ejecutando el io_service hasta su finalización. Esto a menudo requiere establecer el estado, cancelar operaciones pendientes y evitar que los manejadores de finalización publiquen trabajo adicional en el io_service . Boost.Asio proporciona un ejemplo de tiempo de espera oficial, y también se muestra un enfoque de tiempo de espera con ejecución hasta el io_service del servicio io_service .

Estoy usando (un solo hilo) un boost::asio:io_service para manejar una gran cantidad de conexiones tcp. Para cada conexión, uso un deadline_timer para capturar los tiempos de espera. Si alguna de las conexiones expira, no puedo usar ninguno de los resultados de las otras conexiones. Por lo tanto, quiero reiniciar completamente mi io_service. Pensé que llamar a io_service.stop() permitiría llamar a los manejadores "terminados" en la cola y llamaría a los controladores en la cola con un error.

Sin embargo, parece que los manipuladores permanecen en la cola y, por lo tanto, al llamar a io_service.reset() y luego a io_service.run() los controladores anteriores. ¿Alguien puede confirmar que los controladores de hecho permanecen en la cola incluso después de io_service.stop() ? Y si es así, ¿cuáles son las posibilidades de restablecer completamente el io_service, por ejemplo, eliminar todos los controladores en cola?