pthread_kill ne pas tuer le thread C linux
je fais un petit projet, qui seront intégrés dans un projet plus vaste. essentiellement, ce qu'il fait est de garde la trace de threads qui sont créées par les ajoutant à une structure qui conserve la trace de ce que le fil n' (sa fonction principale) et de ses pthread_t id. les autres struct garde une trace des données à transmettre à la fonction et le numéro d'élément de où la pthread_t id est stocké à l'intérieur de threads[]. son un peu micky mouse et il saute un peu, mais tout fonctionne d'ailleurs quand il est temps de tuer le fil. je n'ai pas de segmentation et aucune erreur et le programme se termine bien, mais le thread n'a pas été tué lors de l'pthread_kill() est appelée (la fonction renvoie la valeur 0, ce qui signifie qu'aucune erreur et cela a fonctionné), bien que le thread continue à courir jusqu'à l'application principale retourne.
strace
est votre ami.- Pourquoi êtes-vous en train d'essayer de tuer un thread de toute façon? Si le thread est en train de faire les travaux que vous souhaitez faire, pourquoi voulez-vous tuer? Si le thread est en train de faire le travail, vous ne voulez pas que ça à faire, régler le problème, alors il ne le travail que vous voulez qu'il fasse. Et si le thread n'a pas de travail, le code de sorte qu'il finit lui-même.
- les fonctions dans mon application principale sont codées dans une telle affaire, où ils vont quitter le fil normalement, mais lors de certains événements que j'ai à force de résilier le fil.
Vous devez vous connecter pour publier un commentaire.
pthread_kill()
ne va pas tuer un thread. La seule différence aveckill()
est que le signal est traité par l'agent désigné du thread et non traités au cours de ce thread est le signal masqué (voirpthread_sigmask()
). Un signal commeSIGTERM
, par défaut, toujours mettre fin à tout le processus.Si vous envisagez d'appeler
pthread_exit()
à partir d'un gestionnaire de signal, vous devriez probablement utiliserpthread_cancel()
à la place.Annulation est sûr, si tout le code qui peut être annulée coopère (ou le code qui l'appelle, il désactive l'annulation (pour le moment). La plupart des bibliothèques ne se soucient pas de cela, cependant.
Une méthode plus sûre est de poser le fil de sortie sans aucune force, par exemple l'envoi d'un message spécial (si le thread normalement traite les messages).
Sinon, ne vous embêtez pas à tuer tous les threads et il suffit d'appeler
_exit()
,_Exit()
ouquick_exit()
.pthread_exit
n'est pas asynchrone signal fort, donc la seule façon que vous pouvez appeler à partir d'un gestionnaire de signal est si vous assurer que les signaux sont bloqués à chaque fois que l'appel asynchrone de signal dangereux fonctions.De http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_kill.html
donc la suite
Coutume fait tuer le thread. Vous avez besoin d'utiliser un signal réel pour tuer un thread. Une liste de signaux peuvent être trouvés ici:
http://pubs.opengroup.org/onlinepubs/7908799/xsh/signal.h.html