Wie kann ich einen einzelnen Thread unter Linux beenden?

13

Bildbeschreibung hier eingeben

Dies sind die einzelnen Threads des Packet Receiver-Prozesses. Gibt es eine Möglichkeit, einen einzelnen Thread abzutöten? Stellt Linux einen bestimmten Befehl zur Verfügung, mit dem ein Stoppsignal an einen bestimmten Thread in einem Prozess abgebrochen oder gesendet werden kann?

Md. Kawsaruzzaman
quelle
Was ist Ihr Paketempfängerprogramm? (Ich habe es nicht auf meinem Debian-Desktop) Bitte erzählen Sie mehr, stellen Sie vielleicht einen Link zur Verfügung. Bearbeiten Sie also Ihre Frage , um sie zu verbessern.
Basile Starynkevitch
1
Ich denke, Sie wissen nicht, dass das "Stop" -Signal einen Prozess stoppt, unabhängig davon, an welchen Thread Sie ihn senden.
David Schwartz
1
Mit GDB anhängen und den Thread beenden, dann trennen.
Martin
1
@ Md.Kawsaruzzaman Das geht einfach nicht. Angenommen, der Thread befindet sich in der Mitte der Speicherzuweisung und hält die Sperre für den Speicherzuweiser. Wenn Sie den Thread anhalten, wird die Sperre niemals aufgehoben, und schließlich werden auch die anderen Threads angehalten. Was auch immer Sie versuchen, dies ist nicht der richtige Weg. (Es kann sein, dass Sie verhindern möchten, dass die Arbeit, die der Thread ausführt, ausgeführt wird. Dafür benötigen Sie jedoch die Zusammenarbeit des Prozesses. Wenn dies nicht möglich ist, ist dies nicht möglich.)
David Schwartz
1
Beachten Sie auch, dass in Ihrem Screenshot jeder "Thread" eine eigene PID hat. Ich bin mir nicht sicher, ob Sie sogar separate Threads ansprechen können, da Signale nur an Prozesse gesendet werden können.
Szalski

Antworten:

16

Es ist im Allgemeinen ziemlich gefährlich, einen einzelnen Thread in einem größeren Prozess abzutöten. Dieser Thread könnte:

  • Ändern Sie einen gemeinsam genutzten Status mit anderen Threads, die beschädigt werden könnten
  • Halten Sie eine Sperre, die niemals freigegeben wird, wodurch die Sperre auf unbestimmte Zeit nicht mehr verfügbar ist
  • ... oder eine beliebige Anzahl anderer Dinge, die dazu führen können, dass andere Threads schief gehen.

Im Allgemeinen ist es nicht sinnvoll, einzelne Threads zu löschen, außer dass sie von der Anwendung selbst verwaltet und synchronisiert werden.

Chris Down
quelle
5
Das ist überhaupt nicht sinnvoll. OP fragt, wie ein Thread getötet werden soll, nicht, ob sie sollen oder nicht.
Martin
Was ich will, ist der Prozess, um einen bestimmten Thread für einen bestimmten Zweck zu töten oder zu stoppen. Ich gehe davon aus, dass unser Receiver aufgrund eines Fehlers manchmal automatisch heruntergefahren wird. Wir finden die Ursachen, während das Programm von unserer eigenen Forschung und Entwicklung entwickelt wird. Jetzt besteht die Möglichkeit, dass einige Threads automatisch heruntergefahren werden. Wir haben von Code auf dieser Seite getestet und bekam das Kind Thread sind unabhängig , aber von Server - Seite noch einige Threads nach unten manchmal bekommen , die gesamte Prozess verursacht auch herunterzufahren ..
Md . Kawsaruzzaman
12

Sie können tgkill (2) oder tkillin Ihrem C-Programm verwenden (Sie müssen syscall (2) verwenden ), möchten dies aber nicht . In Ihrem Programm können Sie pthread_kill (3) verwenden - was selten nützlich ist.

(Ich weiß nicht genau, welchen Effekt das haben würde tgkilloder tkill- zB mit SIGKILLoder SIGTERM- auf einen Thread)

Die pthreads (7) -Bibliothek verwendet Low-Level-Inhalte (einschließlich einiger signal (7) -s und futex (7) -s etc ...; siehe auch nptl (7) ) und ob Sie einige roh (mit tkilloder tgkill) getötet haben Einzelthread, Ihr Prozess wäre in einem falschen Zustand (so undefiniertes Verhalten ), weil eine interne Invariante unterbrochen wäre.

Lesen Sie also die Dokumentation Ihres Paketempfängerprogramms und suchen Sie einen anderen Weg. Wenn es sich um freie Software handelt , lesen Sie den Quellcode und verbessern Sie ihn.

Lesen Sie Signal (7) und Signalsicherheit (7) genauer durch . Signale sollen an Prozesse gesendet (mit kill (2) ) und in Threads verarbeitet werden.

Und in der Praxis heiraten Signale und Threads nicht gut. Lesen Sie ein pthread-Tutorial .

Ein häufiger Trick beim Codieren eines Multithread-Programms (und wenn Sie mit externen Signalen umgehen möchten SIGTERM) ist, eine Pipe (7) zu Ihrem eigenen Prozess zu verwenden und diese Pipe in einem anderen Thread abzufragen (2) (Sie könnten auch Linux in Betracht ziehen) spezifisches Signal fd (2) ), wobei ein Signalhandler (2) ein Byte oder einige davon in diese Pipe schreibt . Dieser bekannte Trick ist in der Qt-Dokumentation gut erklärt (und Sie können ihn auch ohne Qt in Ihrem eigenen Programm verwenden).

Basile Starynkevitch
quelle
4
Die tgkillFunktion bietet keine Möglichkeit, einen Thread zu beenden. Es sendet ein Signal an einen Thread. Der Name lautet "kill", da dies die historische Methode zum Beenden eines Prozesses ist und nicht zum Beenden eines Threads verwendet werden kann.
David Schwartz
Ich vermute, dass das Senden eines SIGKILLan einen Thread ihm schadet. Oder tötet es immer den gesamten Prozess? Und was ist mit SIGTERM? Übrigens, auch wenn nur ein Thread beschädigt ist, ist mein Punkt, dass der Prozess in einem schlechten Zustand ist.
Basile Starynkevitch
5
Ja, die Signale SIGKILLund SIGTERMwerden definiert, um den Prozess abzubrechen oder zu beenden. Das gilt unabhängig davon, welchen Thread sie erhalten - sie bedeuten immer noch dasselbe. Das Beenden eines Threads ohne die enge Zusammenarbeit seines Prozesses wäre ein Misttrieb und für den Prozess wahrscheinlich katastrophal.
David Schwartz