He estado jugando mucho con Boost.Asio en los últimos tiempos. Me gusta mucho la biblioteca ya que ofrece una manera fantástica de exprimir el rendimiento de los sistemas multinúcleo actuales.¿Cuál es la mejor manera de garantizar la vida útil válida de los objetos cuando se usa Boost.Asio?
Una pregunta que me he hecho varias veces, y he pensado que vale la pena mencionar la duración del objeto/la propiedad al hacer llamadas asíncronas con Asio.
El problema que he encontrado repetidamente es que a menudo tiene que "caducar" un objeto que todavía tiene devoluciones de llamada asincrónicas pendientes en su contra. Si ese objeto queda fuera del alcance antes de que se invoque la devolución de llamada, las cosas inevitablemente explotarán.
Para combatir esto, he comenzado a usar la plantilla boost::enable_shared_from_this
como una clase base para la mayoría de las clases basadas en Asio. Esto funciona bien pero es un poco oneroso: generalmente esto también significa proteger el constructor y agregar un método de fábrica a la clase para garantizar que todas las instancias se creen dentro de un shared_ptr.
Solo quería saber cómo otras personas han abordado este problema. ¿Voy por esto de la mejor manera? ¿O tengo mi Asio.Foo todo mal?
Discute ... :)
Es interesante mencionar ese escenario: mi colega (conocido aquí como Alan) estaba haciendo lo mismo que usted y mencioné la "solución" que había encontrado porque para mí era el mismo problema. Sin embargo, todavía no estoy contento con esto: no me gusta la falta de determinismo, pero eso está bien – jkp