Comment puis-je tuer un thread particulier d'un processus?

21
$ ps -e -T | grep myp | grep -v grep
  797   797 ?        00:00:00 myp
  797   798 ?        00:00:00 myp
  797   799 ?        00:00:00 myp
  797   800 ?        00:00:00 myp

Cela montre le processus mypavec PID = 797 et quatre threads avec différents SPID.

Comment puis-je tuer un thread particulier du processus sans tuer tout le processus. Je comprends que cela pourrait ne pas être possible du tout dans certains cas lorsqu'il y a des dépendances fatales sur ce thread particulier. Mais est-ce possible dans tous les cas? Est-ce oui, comment?

J'ai essayé kill 799et le processus lui-même a été interrompu. Maintenant, je ne suis pas sûr que ce soit parce qu'il y avait des dépendances qui ont mypéchoué sans le processus 800ou parce que kill est tout simplement incapable de tuer des processus individuels.

Lazer
la source

Réponses:

26

Les threads font partie intégrante du processus et ne peuvent pas être tués en dehors de celui-ci. Il existe la fonction pthread_kill mais elle ne s'applique que dans le contexte du thread lui-même. De la documentation sur le lien:

Notez que pthread_kill () ne fait que traiter le signal dans le contexte du thread donné; l'action du signal (fin ou arrêt) affecte le processus dans son ensemble.

gvkv
la source
+1. juste pour ajouter ici. dans le processus, vous pouvez utiliser pthread_kill () pour envoyer des signaux à un thread individuel. peut-être que vous pouvez ajouter un gestionnaire de signal qui le fait.
Hemant
@hemant: Supposons que MS Word utilise un thread séparé pour la vérification orthographique. Tuer ce fil ne devrait pas faire tomber le tout, à moins qu'il ne soit conçu de cette façon. Pourquoi le processus ne peut-il pas exister sans ce fil dans des situations comme celles-ci?
Lazer
1
Eh bien, je suppose que vous pourriez concevoir un modèle de thread pour être indépendant d'un processus parent, mais permettre aux processus externes de tuer les threads intra-processus, mais cela ouvre une boîte de vers en termes de sécurité, de gestion des processus et d'intégrité du système que je ne fais pas '' Je pense que tout concepteur de système se soumettrait volontiers. L'enfilage est assez difficile sans ce genre de maux de tête. Tuer un fil de l'intérieur n'est pas un problème car le travail est effectué par le processus parent qui est tenu responsable si des problèmes surviennent et peuvent être tués - automatiquement ou autrement.
gvkv
"à moins qu'il ne soit conçu de cette façon": la raison principale de l'utilisation des threads est exactement pour que vous puissiez partager des ressources. C'est un peu comme renverser une demi-maison.
pjc50
2
@Lazer, un thread ne peut pas vérifier l'orthographe en même temps qu'un autre thread met à jour le texte car vous tapez. Pour cette raison, pour avoir un thread de vérification orthographique en arrière-plan, il doit faire quelque chose comme saisir un verrou pour empêcher l'autre thread de changer le texte, faire une copie de certains mots, libérer le verrou, puis vérifier les mots copiés dans le Contexte. S'il vous arrivait de le tuer pendant qu'il maintenait le verrou, vous suspendriez l'autre thread dès que vous essayez de taper. Les applications multithread sont pleines d'interdépendances comme celle-ci.
psusi
6

La réponse canonique à cette question est: avec la coopération du processus, quel que soit le mécanisme qu'il fournit. Sans la coopération du processus, c'est impossible. Le fait que le processus se compose de threads est un détail interne du processus qui, par conception intentionnelle, n'est pas exposé à l'extérieur du processus.

David Schwartz
la source
Et qu'en est-il de l'envoi des autres signaux depuis la ligne de commande?
yucer
@yucer, je ne suis pas sûr de comprendre ce que vous demandez.
David Schwartz
Je veux dire envoyer un autre signal de la liste indiquée par "kill -l". Je cherche un moyen de commander un thread particulier pour vider la trace de la pile afin de voir ce qu'il fait.
yucer
@yucer Cela va être spécifique à la plateforme. Certains fournissent un moyen de commander un thread particulier pour vider la pile. Personnellement, j'ai trouvé plus facile d'utiliser un script pour attacher un débogueur (comme gdb) au processus, commander tous les threads pour vider la pile, puis se détacher.
David Schwartz
1

En plus de la réponse de @ gkv, vous pouvez jeter un œil à la fonction pthread_cancel(3), une partie de<pthread.h> . Depuis la page de manuel:

La fonction pthread_cancel () envoie une demande d'annulation au thread. Le moment et le moment où le thread cible réagit à la demande d'annulation dépendent de deux attributs qui sont sous le contrôle de ce thread: son état et son type d'annulation.

Ivan P
la source
1

Vous pouvez trouver tgkill () utile. Il est spécifique à Linux comme le mentionne la page de manuel.

tgkill () envoie le signal sig au thread avec l'ID de thread tid dans le groupe de threads tgid. (En revanche, kill (2) ne peut être utilisé que pour envoyer un signal à un processus (c'est-à-dire un groupe de threads) dans son ensemble, et le signal sera envoyé à un thread arbitraire au sein de ce processus.)

Amit
la source
Cela ne répond pas à la question de savoir comment tuer un thread, pas comment envoyer un signal à un thread.
David Schwartz