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!