Ich benutze pthread_create um mehrere untergeordnete Threads zu erstellen. Zu einer Zeit möchte der Haupt-Thread alle Kind-Threads töten, oder es wird Segment-Falut geben. Welche Funktion sollte ich verwenden, um das zu beenden? Ich suchte die Antwort von Google und bekam Funktion wie pthread_kill. Aber ich wusste nicht, welches Signal ich dem Kind-Thread schicken sollte, um sie zu töten. Meine Laufumgebung ist RHEL 5.4 und die Programmiersprache ist C.Für pthread, wie Kind Thread aus dem Hauptthread zu töten
Antwort
Es ist möglich, einen Thread mit pthread_cancel
"abzubrechen". Dies ist jedoch in der Regel keine bewährte Vorgehensweise, obwohl unter extremen Umständen wie einer SEGFAULT ein vernünftiger Ansatz verfolgt werden kann.
Es gibt ein Beispiel in dieser URL http://linux.die.net/man/3/pthread_cleanup_push – enthusiasticgeek
Warum wird 'pthread_cancel' nicht als Best Practice betrachtet? Und wenn es nicht beste Praxis ist, was ist? – darnir
Sie sollten mit dem Kind gehen zu fork() und halten SIG_TERM jedem Ihrer Fäden, mit
int pthread_kill(pthread_t thread, int sig);
Eine schnelle Möglichkeit, um loszuwerden, alle Threads (neben dem Haupt) ist senden.
Nicht hyper sauber ...
if (fork()) exit(0); // deals also with -1...
Im Allgemeinen Sie wollen nicht wirklich zu heftig ein Kind Thread töten, sondern wollen, dass es fragen, zu beenden. Auf diese Weise können Sie sicher sein, dass das Kind an einem sicheren Ort aufgibt und alle seine Ressourcen gereinigt werden.
Ich mache dies in der Regel mit einem kleinen Stück gemeinsamen Status zwischen Eltern und Kind, um dem Elternteil zu ermöglichen, jedem Kind eine "Quit-Anfrage" zu übermitteln. Dies kann nur ein boolescher Wert für jedes Kind sein, geschützt durch einen Mutex. Das Kind überprüft diesen Wert regelmäßig (jede Schleifeniteration oder was auch immer Sie in Ihrem Kind-Thread Checkpoints haben). Wenn "quick_request" wahr ist, bereinigt der untergeordnete Thread und ruft pthread_exit
.
auf der übergeordneten Seite, die „kill_child“ Routine sieht wie folgt aus etwas:
acquire shared mutex
set quit_request to true
pthread_join the child
Die pthread_join einige Zeit dauern kann, je nachdem, wie häufig das Kind überprüft seine Anfrage zu beenden. Stellen Sie sicher, dass Ihr Entwurf mit der Verzögerung umgehen kann.
Während es allgemein üblich ist, einen Mutex zu erwerben, bevor Speicher geändert wird, der zwischen Threads geteilt wird, bedeutet die Tatsache, dass es sich um ein einzelnes Flag handelt, das auf einen Status ungleich Null (oder false) überprüft wird, dass Sie nicht wirklich benötigen einen Mutex greifen. In diesem Fall kann wirklich nicht viel aus der Datenkohärenzperspektive schief gehen. –
@Brent: [Diese Frage] (http://stackoverflow.com/questions/21183261/is-a-race-condition-possible-when-only-one-thread-writes-to-a-bool-variable-in -c) zeigt ein Beispiel, bei dem sogar ein einziges einmal geschriebenes Flag nach Compiler-Optimierungen zu einer Race-Bedingung führen kann. – dshepherd
Schön, das funktioniert wunderbar. – djthoms
Sie können eine globale Variable für das gesamte Programm verwenden.
int _fCloseThreads;
Setzen Sie es auf 1, wenn die Ausführung der Threads beendet werden soll. Lassen Sie die Threads diese Variable in ihrer "Schleife" überprüfen und beenden Sie sie, wenn sie auf 1 gesetzt ist. Sie müssen sie nicht mit einem Mutex schützen.
Sie müssen warten, bis die Threads beendet sind. Sie können Join verwenden. Eine andere Möglichkeit besteht darin, einen Zähler zu erhöhen, wenn ein Thread in seinen Thread-Prozess eintritt, und den Zähler dann zu beschädigen, wenn er beendet wird. Der Zähler müsste eine globale Art sein. Verwenden Sie gcc atomare Ops auf dem Zähler. Der Hauptthread kann nach dem Setzen von fCloseThreads auf den Zähler warten, um durch Schleifen, Schlafen und Überprüfen der Zählung auf Null zu gehen.
Schließlich könnten Sie pthread_cleanup_push und pop überprüfen. Sie sind ein Modell, das einem Thread erlaubt, irgendwo in seinem Code abzubrechen (verwendet einen longjump) und dann eine endgültige Bereinigungsfunktion aufzurufen, bevor threadproc beendet wird. Sie setzen cleanup_push am oberen Rand von threadproc und cleanup_pop am unteren Rand, erstellen eine Unwind-Funktion, und an bestimmten Abbruchpunkten springt ein Thread, der durch einen Aufruf von pthread_cancel() abgebrochen wurde, zurück zu threadproc und ruft die unwind-Funktion auf.
http://linux.die.net/man/3/pthread_cleanup_push hat ein Beispiel. – enthusiasticgeek
- 1. Kill Thread in Pthread Bibliothek
- 2. Alternative Methode Thread zu töten
- 3. Std :: Thread erkennen Hauptthread
- 4. Wie Hintergrund php Thread zu töten?
- 5. Wert aus Thread in Python zurückgeben, ohne Hauptthread zu blockieren
- 6. PThread vs boost :: thread?
- 7. Pthread nicht für Mutex-Sperre warten threadFinished
- 8. Ausführen von Code auf dem Hauptthread von einem sekundären Thread?
- 9. Pthread Zustandssignal mit Arbeiter Thread
- 10. Führen Sie Code im Hauptthread von einem Worker-Thread aus
- 11. Wie Kind SKSpriteNode vom Elternteil SKSpriteNode zu entfernen, ohne Kind zu töten
- 12. Wie Eltern und Kind Prozess durch Shell zu töten?
- 13. Wie kann ich einen Thread in Python zu töten
- 14. Führt eine Methode im Hauptthread aus dem Ereignishandler aus
- 15. Setzen Sie den Cache auf Okhttp3 aus dem Hauptthread
- 16. Pthread Funktion aus einer Klasse
- 17. Erkennen, wenn Sie in/aus dem Hauptthread in Xamarin.iOS sind
- 18. Thread-Synchronisierung mit pthread bedingte Variable
- 19. Pthread einen Thread Zyklus basierend auf Benutzereingaben
- 20. AscyncTask - Nicht auf dem Hauptthread
- 21. Übersprungen 130 Frames, zu viel Arbeit auf dem Hauptthread
- 22. Wie zu töten Port
- 23. Wie alle Threads zu töten, die sie nicht den Hauptthread sind?
- 24. Ich möchte einen Std :: Thread mit seinem Thread-Objekt töten?
- 25. Python: wie Pakete in Multi-Thread zu senden und dann der Thread sich selbst töten
- 26. einen laufenden Thread in Java töten?
- 27. Töten Befehl Fehler aus
- 28. Wie töte ich ein Pthread in ANSI C
- 29. Wie Zombie-Prozess zu töten
- 30. Wie Hauptthread von Java erstellt
wow, kill alle thread, weil es ein segfault sein wird? Machst du Witze? Ich würde niemals durch ein bisschen Code so umgehen. –
Wahrlich, ich gdb den Core-Dump gefunden, wenn der Haupt Thread globale Objekte dekonstruiert wurden. Einige Child-Threads können derzeit eine solche Variable verwenden und der Segmentfehler wird auf meinem Bildschirm ausgegeben. Obwohl die Logik richtig ist und der Segmentfehler keine Auswirkungen auf mein Programm hat, weil es fertig ist. – terry
Korrigieren Sie die Logik. Wenn die anderen Threads immer noch nützliche Arbeit leisten, warum versuchen Sie, das Programm zu beenden? Wenn die anderen Threads diese Objekte auch dann benötigen, wenn 'main' den Gültigkeitsbereich verlässt, warum werden sie auf' main's Stack zugewiesen? –