pthread_detach question
Jusqu'à récemment, j'étais sous l'impression que si vous "détacher" un fil après la ponte, le fil de vie, même après le "principal" thread se termine.
Mais un peu d'expérience (voir ci-dessous) est contraire à mes convictions. Je m'attendais à le détacher de la ficelle pour maintenir l'impression de "Parler de l'détaché fil" même après la principale terminée, mais cela ne semble pas être le cas. L'application se termine apparemment...
Faire de la "détaché" fils meurent après le "principal" questions return 0?
#include <pthread.h>
#include <stdio.h>
void *func(void *data)
{
while (1)
{
printf("Speaking from the detached thread...\n");
sleep(5);
}
pthread_exit(NULL);
}
int main()
{
pthread_t handle;
if (!pthread_create(&handle, NULL, func, NULL))
{
printf("Thread create successfully !!!\n");
if ( ! pthread_detach(handle) )
printf("Thread detached successfully !!!\n");
}
sleep(5);
printf("Main thread dying...\n");
return 0;
}
Ce n'est pas une bonne idée de sortie le thread principal tandis que les autres threads sont en cours d'exécution; dans tous les cas, le retour de la fonction main() va entraîner d'autres threads d'être tué de toute façon.
OriginalL'auteur puffadder | 2011-05-18
Vous devez vous connecter pour publier un commentaire.
Pour citer le Manuel du Programmeur Linux:
Aussi de la Manuel du Programmeur Linux:
le thread principal n'est pas "juste un autre thread": il y a quelques cas où les pthreads traiter le thread principal différemment des autres threads; (2)
return 0
etpthread_exit()
ne sont pas équivalentes; j'ai élargi ma réponse.Aha! Là, vous allez... une fois, j'ai lu quelque part que pthread_exit() et de retour sont les mêmes pour les threads... et c'est pourquoi toute la confusion !!! Merci beaucoup pour les précisions.
Le
pthread_exit
fonction et le retour à partir de la fonction sont les mêmes pour tous les threads. Cependant, pour le thread qui exécute lorsque le processus démarre,main
est pas son départ de la fonction. (Comment pourrait-il être? Si cela était, ce serait d'initialiser les variables globales? Ce qui permettrait de remplirargc
etargv
? Ce serait passer sur la valeur retournée parmain
?) Quand il revient d'principal, il renvoie à la fonction qui a appelémain
, qui passe ensuite sur terminer le processus.OriginalL'auteur
pthread_detach
signifie juste que vous n'allez jamais à joindre avec le fil à nouveau. Cela permet à la bibliothèque pthread de savoir si elle peut immédiatement se débarrasser du fil de ressources une fois que le thread s'arrête (le détachement des cas) ou si elle doit les garder, parce que vous pouvez appeler plus tardpthread_join
sur le fil.Une fois les principaux retours (ou sortie), l'OS va profiter de tous vos fils et de détruire votre processus.
OriginalL'auteur
pthread_detach
ne pas faire ce que vous pensez qu'il fait - il indique à la mise en œuvre que l'espace de la discussion avec l'ID spécifié est l'aide qui peut être récupérée dès qu'elle se termine, c'est à dire. pas depthread_join
opération sera effectuée sur elle.Tous les threads sont fin une fois que le processus qui en contiennent est terminée.
OriginalL'auteur
Oui, le détaché fils va mourir après
return 0
.De la section NOTES de
man pthread_detach
OriginalL'auteur
De
man pthread_detach
:OriginalL'auteur