6 votes

Est-ce que le fil C++ 11 se détruit automatiquement après s'être détaché ?

Normalement, je supposerais que le thread C++ 11 se détruit automatiquement après s'être détaché. Mais le problème, c'est que je ne trouve rien pour prouver cette supposition.

According to this article

Une fois détaché, le thread devrait vivre ainsi pour toujours.

toujours? Si la fonction du thread se termine, ses ressources restent-elles pour toujours?

According to this article

Après un appel à cette fonction, l'objet thread devient non-joignable et peut être détruit en toute sécurité.

Il peut être détruit en toute sécurité, mais est-ce automatiquement?

Si ce n'est pas détruit automatiquement, comment le détruire (pas de manière forcée, mais après la fin de la fonction du thread)

Merci de lire.

8voto

Rakete1111 Points 10248

Vous devriez consulter une meilleure référence. De std::thread::detach:

Sépare l'exécution du thread de l'objet thread, permettant à l'exécution de continuer de manière indépendante. Tous les ressources allouées seront libérées une fois que le thread se termine.

Après avoir appelé detach *this ne possède plus de thread.

Donc pour répondre à vos questions (si elles ne sont pas déjà posées):

Pour toujours?

Non. Si le thread se termine (par exemple: s'il compte jusqu'à 10), il est terminé et ne fonctionne plus.

Est-ce que ses ressources restent pour toujours?

Non, lorsque le thread se termine, toutes les ressources du thread sont libérées (comme les variables, etc.).

Peut-il être détruit en toute sécurité, mais est-ce automatique?

Que voulez-vous dire? Lorsque le thread est terminé, il est détruit (automatiquement), que vous appeliez detach ou non. La seule différence ici, c'est qu'ils se réfèrent à l'objet thread, donc l'instance réelle de std::thread.

Donc lorsque l'objet thread est détruit, vous devez avoir appelé join ou detach peu importe si vous détenez que le thread réel ait fini ou non. Sinon, std::terminate est appelé.

2voto

jschmerge Points 255

Un std::thread est simplement une mince enveloppe autour de la bibliothèque de threading native de votre plateforme... Il ne contient pas vraiment grand-chose en interne, mis à part quelques drapeaux et la poignée native vers la représentation du thread de la plateforme (qui, pour Unix et Windows, est un identifiant intégral sophistiqué). En parlant spécifiquement des systèmes de type Unix, l'appel à std::thread::detach() fait deux choses :

  • appelle une variation de pthread_detach(), qui libère une structure de données utilisée pour stocker le pointeur void de retour du thread-main natif de la plateforme.
  • définit un drapeau dans la classe indiquant que le thread a été détaché, ce qui empêche en retour le déclenchement d'une exception par le destructeur.

Pour ce qui est des autres ressources que la création du thread peut configurer, celles-ci doivent être nettoyées par le temps d'exécution de votre plateforme lorsque votre thread-main se termine.

En d'autres termes, std::thread::detach permet simplement à l'enveloppe d'être détruite sans déclencher une exception ; la pile réelle du thread et la récupération des ressources du système d'exploitation se produisent dans le contexte d'exécution du thread après la sortie de la fonction principale de votre thread, et cela devrait être automatique à 100%.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X