Por qué el bloqueo: razones detrás de los destructores de bloqueo de futuros devueltos por std::async
Cuando se trabaja con tareas asincrónicas, el destructor de a Future devuelto por std::async se caracteriza por su comportamiento de bloqueo, lo que genera dudas sobre su necesidad. Para profundizar en esta elección de diseño, exploremos las preocupaciones y discusiones que llevaron a su implementación.
El artículo de Herb Sutter, "async, ~future, and ~thread", destaca las consideraciones de seguridad relacionadas con el bloqueo de destructores. Sin este comportamiento, un subproceso "fugitivo" asociado con el futuro podría continuar ejecutándose después de que se haya destruido su estado asociado. Esta falta de control sobre la finalización de tareas podría provocar daños en la memoria u otros problemas inesperados.
El artículo de Hans Boehm, "Async() Future Destructors Must Wait", proporciona un ejemplo concreto de esta preocupación. Sin bloquear los destructores, el manejo de excepciones o los eventos externos podrían interrumpir el flujo esperado de ejecución de tareas. Como señala Boehm, esto podría crear una vulnerabilidad de seguridad en la que un atacante podría manipular el tiempo de las excepciones para aprovechar un descuido en las protecciones de alcance, lo que llevaría a la sobrescritura de la pila y al secuestro de procesos.
El destructor de bloqueo sirve como protección contra estos peligros potenciales, evitando que el hilo asociado continúe ejecutándose después de que se destruya el futuro. Sin embargo, es importante tener en cuenta que este comportamiento es específico de los futuros devueltos por std::async con una política de lanzamiento asincrónica. Otros futuros, como los devueltos por std::promise o futuros de algoritmos paralelos, no exhiben el mismo comportamiento de bloqueo en sus destructores.
A pesar de las preocupaciones de seguridad planteadas, el destructor de bloqueo de std::async futuros ha sido un tema de debate continuo dentro del comité de estandarización de C. Los cambios propuestos para desaprobar el comportamiento de bloqueo o hacerlo no estándar para futuros asíncronos no han sido adoptados.
En resumen, los destructores de bloqueo de futuros devueltos por std::async es una elección de diseño controvertida impulsada por preocupaciones de seguridad. . Si bien previene posibles problemas relacionados con la ejecución incontrolada de subprocesos, también introduce la necesidad de una gestión explícita del ciclo de vida de los subprocesos y protecciones de alcance para garantizar una limpieza adecuada.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3