Maison > développement back-end > C++ > Pourquoi les contrats à terme std::async ont-ils des destructeurs bloquants ?

Pourquoi les contrats à terme std::async ont-ils des destructeurs bloquants ?

Linda Hamilton
Libérer: 2024-12-19 11:12:13
original
399 Les gens l'ont consulté

Why Do std::async Futures Have Blocking Destructors?

Pourquoi le blocage : raisons derrière les destructeurs bloquants des futurs renvoyés par std::async

Lorsque vous travaillez avec des tâches asynchrones, le destructeur de un futur renvoyé par std::async est connu pour son comportement bloquant, soulevant des questions sur sa nécessité. Pour approfondir ce choix de conception, explorons les préoccupations et les discussions qui ont conduit à sa mise en œuvre.

L'article de Herb Sutter, "async, ~future, and ~thread", met en évidence les considérations de sécurité liées au blocage des destructeurs. Sans ce comportement, un thread « en fuite » associé au futur pourrait continuer à s'exécuter après la destruction de son état associé. Ce manque de contrôle sur l'achèvement des tâches pourrait potentiellement entraîner une corruption de la mémoire ou d'autres problèmes inattendus.

L'article de Hans Boehm, "Les futurs destructeurs Async() doivent attendre", fournit un exemple concret de cette préoccupation. Sans blocage des destructeurs, la gestion des exceptions ou des événements externes pourraient perturber le flux attendu d’exécution des tâches. Comme le souligne Boehm, cela pourrait créer une vulnérabilité de sécurité dans laquelle un attaquant pourrait manipuler le timing des exceptions pour exploiter une omission dans les gardes de portée, conduisant à l'écrasement de la pile et au détournement de processus.

Le destructeur bloquant sert de protection contre ces dangers potentiels, empêchant le thread associé de poursuivre son exécution après la destruction du futur. Cependant, il est important de noter que ce comportement est spécifique aux futures renvoyés par std::async avec une politique de lancement asynchrone. D'autres futurs, tels que ceux renvoyés par std::promise ou les futurs d'algorithmes parallèles, ne présentent pas le même comportement de blocage dans leurs destructeurs.

Malgré les problèmes de sécurité soulevés, le destructeur bloquant des futurs std::async a été un sujet de débat en cours au sein du comité de normalisation C. Les modifications proposées visant à déprécier le comportement de blocage ou à le rendre non standard pour les futurs asynchrones n'ont pas été adoptées.

En résumé, les destructeurs bloquants des futurs renvoyés par std::async sont un choix de conception controversé motivé par des problèmes de sécurité. . Bien qu'il évite les problèmes potentiels liés à l'exécution incontrôlée des threads, il introduit également la nécessité d'une gestion explicite du cycle de vie des threads et des protections de portée pour garantir un nettoyage approprié.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal