Maison > développement back-end > C++ > Pourquoi le destructeur `std::future` renvoyé par `std::async` bloque-t-il ?

Pourquoi le destructeur `std::future` renvoyé par `std::async` bloque-t-il ?

Mary-Kate Olsen
Libérer: 2024-11-15 14:26:02
original
933 Les gens l'ont consulté

Why Does the `std::future` Destructor Returned by `std::async` Block?

Nature bloquante du destructeur std::future renvoyé par std::async

Lors de l'intention de lancer une tâche de manière asynchrone, il a été découvert que le destructeur d'un std::future renvoyé par std::async présente un comportement bloquant. Cela a soulevé des questions sur la justification de cette décision de conception et sur la possibilité de l'améliorer pour des raisons de commodité et d'efficacité.

Arguments en faveur du blocage du Destructeur

L'une des principales préoccupations abordées par le destructeur bloquant empêche les threads « emballés ». Si le std::future était détruit sans attendre la fin du thread associé, cela pourrait conduire à un comportement imprévisible et à une corruption potentielle de la mémoire.

Comme décrit dans l'article de Hans Boehm (N3679), ce problème peut survenir lorsqu'un le thread fonctionne sur des données qui ont déjà été détruites. Sans destructeur bloquant, le thread pourrait potentiellement continuer à accéder à ces données et à les modifier, ce qui entraînerait des problèmes de mémoire entre les threads.

Approches alternatives

Certains ont suggéré qu'un un destructeur non bloquant serait suffisant si les méthodes get ou wait étaient toujours appelées pour récupérer le résultat ou attendre la fin. Cependant, Boehm affirme que s'appuyer sur des appels explicites est sujet à surveillance et pourrait conduire à des vulnérabilités en matière de sécurité. Des circonstances exceptionnelles, telles que des exceptions lors de l'exécution, pourraient contourner ces appels et entraîner la création de threads incontrôlables.

État actuel et développements futurs

Malgré les discussions en cours au sein du Comité des normes C, aucun changement n'est prévu pour le comportement de blocage des destructeurs std::future dans C 14. Cependant, le problème reste à l'étude et les futures versions de C pourraient résoudre ce comportement.

Recommandations pratiques

Pour éviter les problèmes potentiels liés au blocage des destructeurs, il est recommandé de toujours appeler get ou attendre avant de détruire un std::future renvoyé par std::async. Cela garantit que le thread associé a terminé son exécution et que toutes les ressources nécessaires ont été libérées.

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