Por que o bloqueio: razões por trás do bloqueio Destruidores de futuros retornados por std::async
Ao trabalhar com tarefas assíncronas, o destruidor de um futuro retornado por std::async é conhecido por seu comportamento de bloqueio, levantando questões sobre sua necessidade. Para nos aprofundarmos nessa escolha de design, vamos explorar as preocupações e discussões que levaram à sua implementação.
O artigo de Herb Sutter, "async, ~future, and ~thread", destaca considerações de segurança relacionadas ao bloqueio de destruidores. Sem esse comportamento, um thread "em fuga" associado ao futuro poderia continuar em execução após seu estado associado ter sido destruído. Essa falta de controle sobre a conclusão da tarefa pode levar à corrupção da memória ou outros problemas inesperados.
O artigo de Hans Boehm, "Async() future destructors must wait", fornece um exemplo concreto dessa preocupação. Sem o bloqueio de destruidores, o tratamento de exceções ou eventos externos poderiam interromper o fluxo esperado de execução da tarefa. Como aponta Boehm, isso poderia criar uma vulnerabilidade de segurança em que um invasor poderia manipular o tempo das exceções para explorar um descuido nos protetores de escopo, levando à substituição de pilha e ao sequestro de processo.
O destruidor de bloqueio serve como uma proteção contra esses perigos potenciais, evitando que o thread associado continue a execução após o futuro ser destruído. No entanto, é importante observar que esse comportamento é específico para futuros retornados por std::async com uma política de inicialização assíncrona. Outros futuros, como aqueles retornados por std::promise ou futuros de algoritmos paralelos, não exibem o mesmo comportamento de bloqueio em seus destruidores.
Apesar das preocupações de segurança levantadas, o destruidor de bloqueio de std::async futures tem sido um tópico de debate contínuo dentro do comitê de padronização C. As alterações propostas para descontinuar o comportamento de bloqueio ou torná-lo fora do padrão para futuros assíncronos não foram adotadas.
Em resumo, os destruidores de bloqueio de futuros retornados por std::async são uma escolha de design controversa motivada por questões de segurança . Embora evite possíveis problemas relacionados à execução descontrolada de threads, também introduz a necessidade de gerenciamento explícito do ciclo de vida do thread e dos protetores de escopo para garantir a limpeza adequada.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3