2010-11-26 5 views
1

Ich habe ein Problem mit PThreads mit ANSI C über Linux.Wie töte ich ein Pthread in ANSI C

Ich möchte Befehle mit einem Thread erhalten, so dass es auf sie wartet. Aber in einem bestimmten Fall muss ich es töten.

Wenn ich pthread_kill() verwende, sendet es ein Signal und tötet den gesamten Prozess. Und wenn ich auf dem richtigen Weg bin, erfordert pthread_cancel, dass der Thread dafür vorbereitet wird.

Gibt es einen saubereren oder einfacheren Weg, einen Thread von einem anderen zu töten?

Danke.

+0

Mögliche Wiederholung von http://stackoverflow.com/questions/2084830/kill-thread-in-pthread, verwenden Signalhandler und behandeln pthread_kill() – vpit3833

+1

Nur eine Randnotiz: Sie sollten nicht "ANSI C" sagen, wenn Du meinst es nicht. ANSI C beschäftigt sich nicht mit Threads oder anderen Mitteln zur parallelen Ausführung. Stattdessen meinen Sie wahrscheinlich eine POSIX-Umgebung. –

+0

@ vpit3833 Wir dachten über diese Option nach, vielleicht sollten wir sie noch einmal überdenken ... Ich frage mich nur, ob es mehr Wege gibt. @Roland Illig: Du hast Recht. – jesusiniesta

Antwort

4

Sie sagen nicht, auf welche Art von Befehl/Nachricht Ihr Thread wartet, aber wenn Sie ihm eine Nachricht senden können, "werden Sie sich bitte töten", und dann warten, bis er mit pthread_join stirbt (...)), wirst du viel glücklicher sein.

Wenn Ihr Thread auf einen Dateideskriptor wartet, können Sie poll() oder select() verwenden und auf zwei Dateideskriptoren warten lassen. Dann kann Ihr Haupt-Thread Nachrichten auf dem zweiten senden.

Wenn Ihr Thread auf GUI-Ereignisse wartet, haben die meisten Toolkits eine Möglichkeit, Ihre eigenen Nachrichten zu senden. Zum Beispiel PostMessage() in Win32 oder XSendEvent() in X11.

+0

Es ist eine Teamarbeit, und ich kodiere das nicht, aber ich denke, das ist nur, um Befehle von stdin zu übernehmen (in einem Programm, das Befehle aus einer Datei und/oder anderen Programmnachrichten übernehmen muss). Es hat keine GUI, nur CLI. Danke für die Eingabe. – jesusiniesta

+0

Als ein Hack dann könnten Sie schließen() stdin, und sagen Sie Ihrem Teamkollegen, dass dies bedeutet, sie müssen aufräumen und beenden. – xscott

+0

Eigentlich denke ich im Nachhinein nicht einmal, dass es so viel von einem Hack ist. :-) – xscott