(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.