Pour pthread, Comment tuer l'enfant thread le thread principal
- Je utiliser pthread_create de créer plusieurs threads. À un moment, le thread principal veut tuer tous les enfants de threads ou il y aura segment falut. Quelle fonction dois-je utiliser pour finir? J'ai cherché la réponse de google et a obtenu de fonctionner comme pthread_kill. Mais je ne sais pas quel signal dois-je envoyer à l'enfant de thread pour les tuer. Mon environnement en cours d'exécution est RHEL 5.4 et le langage de programmation C.
- wow, tuer tous les thread, car il y aura une erreur de segmentation? vous plaisantez? Je ne l'avais jamais par un morceau de code qui est géré comme ça.
- Franchement parlant, je gdb le vidage du noyau trouvé lorsque le thread principal de sortie des objets globaux ont été déconstruits. Ainsi, certains des enfants les threads peuvent actuellement utiliser cette variable et le segment de faille est imprimé sur mon écran. Bien que, la logique est à droite et le segment de faille n'auront pas d'effets sur mon programme parce que c'est fini.
- Fixer la logique. Si les autres threads sont encore en train de faire un travail utile, pourquoi essayez-vous de mettre fin au programme? Si les autres threads encore besoin de ces objets, même quand
main
est hors de portée, pourquoi sont-ils répartis surmain
s de la pile?
Vous devez vous connecter pour publier un commentaire.
Il est possible de "supprimer" un fil à l'aide de
pthread_cancel
. Cependant, ce n'est généralement pas la meilleure pratique bien que dans des circonstances extrêmes, comme une ERREUR de segmentation, il peut être conisdered une approche raisonnable.pthread_cancel
pas considéré comme une bonne pratique? Et si il n'est pas le plus pratique, c'est quoi?En général, vous ne voulez pas vraiment violemment tuer un enfant thread, mais au contraire, vous voulez lui demander de mettre fin. De cette façon, vous pouvez être sûr que l'enfant est à cesser de fumer à un endroit sûr, et toutes ses ressources sont nettoyées.
Je fais généralement avec un petit morceau d'un état partagé entre le parent et l'enfant pour permettre à la mère de communiquer un "quittez la demande" pour chaque enfant. Cela peut juste être une valeur booléenne pour chaque enfant, protégée par un mutex. L'enfant vérifie cette valeur périodiquement (à chaque itération de boucle, ou quelle que soit la pratique des points de contrôle que vous avez dans votre enfant thread). En voyant "quit_request" être fidèle, l'enfant thread nettoie et appels
pthread_exit
.Sur le parent côté, le "kill_child" routine ressemble à quelque chose comme ceci:
La pthread_join peut prendre un certain temps, selon la fréquence de l'enfant vérifie sa demande de quitter. Assurez-vous que votre conception peut gérer quel que soit le délai peut être.
pthread_join
? Ne pas le fil ont besoin d'être garanti d'être en vie quand il est joint?Vous devez envoyer SIG_TERM à chacun de vos fils, à l'aide de
Un moyen rapide de se débarrasser de tous les threads (en plus de la principale) est de fork() et continuer avec l'enfant.
Pas hyper propre...
Vous pouvez utiliser une variable globale pour l'ensemble du programme.
int _fCloseThreads;
Mis à 1 quand vous voulez les threads pour arrêter l'exécution. Disposez les filets de vérifier que la variable dans leur "boucle" et bien quitter lorsqu'elle est définie sur 1. Pas besoin de le protéger avec un mutex.
Vous avez besoin d'attendre pour les filets de cesser de fumer. Vous pouvez utiliser la rejoindre. Une autre façon est d'incrémenter un compteur lorsqu'un thread entre dans son thread proc et puis decriment le comptoir lorsqu'il la quitte. Le compteur devrait être globale de toutes sortes. Utiliser gcc atomique ops sur le comptoir. Le thread principal, après le réglage de fCloseThreads, peut attendre sur le compteur à zéro par le bouclage, du sommeil, et de vérifier le nombre de.
Enfin, vous pouvez la caisse pthread_cleanup_push et de la pop. Ils sont un modèle pour permettre à un thread d'annuler n'importe où dans le code (utilise un longjump) et ensuite appeler une dernière fonction de nettoyage avant de quitter threadproc. Vous fondamentalement mis cleanup_push en haut de votre threadproc et cleanup_pop au fond, créer un déroulement de la fonction, et puis à certains d'annulation des points d'un fil annulé par un appel à pthread_cancel() va longjump retour à threadproc et appelez le déroulement de la fonction.