GNU/Linux >> Tutoriels Linux >  >> Linux

return() contre pthread_exit() dans les fonctions de démarrage de pthread

(1) En code C++, en utilisant return provoque le déroulement de la pile et la destruction des variables locales, alors que pthread_exit est uniquement garanti pour appeler les gestionnaires d'annulation enregistrés avec pthread_cancel_push() . Sur certains systèmes, ce mécanisme entraînera également l'appel des destructeurs des variables locales C++, mais cela n'est pas garanti pour le code portable --- consultez la documentation de votre plate-forme.

Aussi, en main() , return appellera implicitement exit() , et ainsi terminer le programme, alors que pthread_exit() terminera simplement le thread, et le programme continuera à fonctionner jusqu'à ce que tous les threads soient terminés ou que certains threads appellent exit() , abort() ou une autre fonction qui termine le programme.

(2) L'utilisation de return fonctionne parce que la spécification POSIX le dit. La valeur renvoyée est stockée à un endroit où pthread_join() peut le récupérer. Les ressources utilisées par le thread ne sont pas récupérées avant pthread_join() est appelé.

(3) Je n'utilise jamais la valeur de retour d'un thread dans les threads POSIX bruts. Cependant, j'ai tendance à utiliser des fonctionnalités de niveau supérieur telles que la bibliothèque de threads Boost, et plus récemment la bibliothèque de threads C++0x, qui fournissent des moyens alternatifs pour transférer des valeurs entre les threads tels que les futurs, ce qui évite les problèmes associés à la gestion de la mémoire que vous faire allusion à.


Je pense que return du start_routine est préférable, car il garantit que la pile d'appels est correctement déroulée.

Ceci est encore plus important pour C que C++ car il n'a pas la magie destructrice qui nettoie le désordre après les sorties préliminaires. Votre code doit donc passer par toutes les parties finales des routines sur la pile d'appels pour faire free s et similaires.

Pour savoir pourquoi cela fonctionne, c'est simple

Si la start_routine revient, l'effet sera comme s'il y avait un appel implicite à pthread_exit() en utilisant la valeur de retour de start_routine comme état de sortie

Pour mon expérience personnelle, j'ai tendance à ne pas beaucoup utiliser le statut des threads terminés. C'est pourquoi je fais souvent commencer les discussions detached . Mais cela devrait dépendre beaucoup de l'application et n'est certainement pas généralisable.


Linux
  1. Démarrer un processus sur un autre téléscripteur ?

  2. Sauvegardes au niveau octet ou au niveau fichier ?

  3. Fonctions dans les variables shell ?

  4. Activer les services sous Linux

  5. Comment nommer un thread sous Linux ?

Fonctions bash

Démarrer avec GNUPlot

Le noyau Linux et ses fonctions

pthread_exit vs retour

Comment obtenir l'identifiant de thread d'un pthread dans le programme linux c?

Valeur de retour de x =os.system(..)