On dirait que vous avez deux questions ici :
Comment puis-je attendre que mon fil se termine ?
Réponse : Ceci est directement supporté par pthreads -- rendez votre thread à arrêter JOINABLE (quand il est démarré pour la première fois), et utilisez pthread_join() pour bloquer votre thread actuel jusqu'à ce que le thread à arrêter ne tourne plus.
Comment puis-je savoir si mon fil est toujours en cours ?
Réponse : Vous pouvez ajouter un drapeau "thread_complete" pour faire l'affaire :
Scénario : Le fil A veut savoir si le fil B est encore en vie.
Lorsque le thread B est créé, il reçoit un pointeur vers l'adresse du drapeau "thread_complete". L'indicateur "thread_complete" doit être initialisé à NOT_COMPLETED avant la création du thread. La fonction du point d'entrée du thread B doit immédiatement appeler pthread_cleanup_push() pour pousser un "cleanup handler" qui met l'indicateur "thread_complete" à COMPLETED.
Pour plus de détails sur les gestionnaires de nettoyage, cliquez ici : Gestionnaire de nettoyage de pthread
Vous devrez inclure un appel correspondant à pthread_cleanup_pop(1) pour vous assurer que le gestionnaire de nettoyage sera appelé quoi qu'il arrive (c'est-à-dire si le thread sort normalement OU à cause d'une annulation, etc.)
Ensuite, le fil A peut simplement vérifier l'indicateur "thread_complete" pour voir si le fil B est déjà sorti.
NOTE : Votre drapeau "thread_complete" doit être déclaré "volatile" et doit être un type atomique -- les compilateurs GNU fournissent le sig_atomic_t dans ce but. Cela permet aux deux threads d'accéder de manière cohérente aux mêmes données sans avoir besoin de constructions de synchronisation (mutex/semaphores).
0 votes
Voir aussi stackoverflow.com/questions/1693180/
2 votes
C'est vieux de 10 ans, mais c'est parti... que voulez-vous dire par "attendre qu'un thread finisse de s'exécuter et ensuite détruire le thread" ? Quand un thread finit de s'exécuter, il est détruit.