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 miembroshutdown_service()
. Según el requisito de Tipo de servicio , la función de miembroshutdown_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 elio_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 elio_service
del servicioio_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?