Lorsque je suis dans un destructeur, est-il possible qu'un autre thread commence à exécuter la fonction membre de l'objet? Comment faire face à cette situation?Destructeur vs course de fonction membre
Répondre
C++ n'a pas de protection intrinsèque contre l'utilisation d'un objet après sa suppression - oubliez les conditions de course - un autre thread pourrait utiliser votre objet après qu'il ait été complètement supprimé.
Soit:
- Assurez-vous qu'un seul endroit dans le code propriétaire de l'objet, et il est responsable de la suppression quand personne ne est d'utiliser l'objet.
- Faire la référence d'objet compté - le code de comptage de référence explicite ajouté ou trouver une classe de base appropriée qui implémente référence comptage
Vous ne devriez pas détruire un objet sauf si vous êtes sûr que rien d'autre n'essaiera de l'utiliser - idéalement, rien d'autre ne s'y réfèrera. Vous aurez besoin de regarder de plus près lorsque vous appelez supprimer.
Parfait, réponse simple. Pris plus loin, non seulement cela peut se produire à l'intérieur du destructeur, cela peut arriver après que vous ayez quitté le destructeur. La langue ne peut pas corriger le mauvais design. –
Merci. Je devrais cependant suggérer que la réponse de Douglas Leeder est plus complète que la mienne. – DJClayworth
Dans le cas êtes-vous dans un destructor en raison de la pile déroulage en exception Gestionnaire, je suggère de réorganiser votre code de telle sorte que vous piègez les exceptions dans un bloc sérialisé. Après le bloc, vous vérifiez si l'objet est toujours valide et appelez votre méthode. De cette façon, l'exception dans un thread, permettra aux autres threads de gérer l'appel au destructeur avec élégance.
Si votre objet est partagé par plusieurs threads, une exception ne doit pas déclencher sa destruction. – Eclipse
- 1. PHP: destructeur vs register_shutdown_function
- 2. Pointeur de fonction C++ (membre de la classe) vers la fonction de membre non statique
- 3. Pointeur de fonction de membre polymorphe
- 4. Temps de course aléatoire Trier
- 5. Tableau de pointeurs de fonction membre: Obtenir 0xcccccccc lorsque le contrôle a atteint pointeur vers une fonction membre
- 6. Destructeur pour Singleton
- 7. Qt bibliothèque destructeur Question
- 8. génération de foncteur de type pointeur de fonction membre
- 9. Erreur lors de l'appel de la fonction membre
- 10. Un pointeur de fonction membre appelle un constructeur de copie?
- 11. Analyseurs de conditions de course pour .NET
- 12. Filetage d'une fonction membre à l'intérieur d'un vecteur de classes
- 13. Pointeur de fonction C++ en tant que membre statique
- 14. Propriété vs Fonction (spécifiquement .NET)
- 15. Utilisation d'une fonction de membre de classe C++ en tant que fonction de rappel C
- 16. Signal/Slot vs appels de fonction directe
- 17. Ant course de commande avec des tuyaux
- 18. Éviter une fourche()/Conditions de course SIGCHLD
- 19. tâches de fond en course asp.net
- 20. Le passage d'une fonction membre non statique qualifié comme un pointeur de fonction
- 21. Appelez la fonction membre sur chaque élément d'un conteneur
- 22. Coulée entre void * et un pointeur vers la fonction membre
- 23. Appel à une fonction membre xpath() sur un non-objet?
- 24. Comment assigner une fonction membre à un tableau et l'appeler
- 25. Appel d'une fonction membre statique d'un conteneur STL C++ valeur_type
- 26. Pourquoi la taille de la classe avec une fonction membre est de 1 octet ... Alors que la fonction membre est de 4 octets
- 27. problème avec boost :: bind et la fonction de membre retour auto_ptr
- 28. C++: comment une fonction membre statique publique peut-elle accéder à des variables de membre d'instance privée?
- 29. PHP call_user_func vs simplement appeler la fonction
- 30. Constructeur et destructeur d'objet Excel VBA
Un bon indice utiliserait 'boost :: shared_ptr <>' pour ref-counting. Il prend également en charge des constructions telles que 'weak_ptr <>' ou 'enable_shared_from_this', ce qui rend assez facile la gestion de toute une vie. – gimpf
Malheureusement, suivre l'un ou l'autre conseil n'est pas suffisant pour éviter les courses de données potentielles. Imaginez: le thread A crée l'objet et transmet une référence au thread B. Sur B, une fonction de membre en mutation est appelée. Plus tard, A détruit l'objet qui nécessite d'accéder à la variable membre. – CouchDeveloper