it-swarm.com.de

Töte Thread in der Pthread Library

Ich benutze pthread_create(&thread1, &attrs, //... , //...); und muss, falls eine Bedingung aufgetreten ist, diesen Thread beenden, wie kann ich das beenden?

38
Sajad Bahmani

Speichern Sie zuerst die Thread-ID

pthread_create(&thr, ...)

dann später anrufen

pthread_cancel(thr)

Dies ist jedoch keine empfohlene Programmierpraxis! Es ist besser, einen Inter-Thread-Kommunikationsmechanismus wie Semaphore oder Nachrichten zu verwenden, um dem Thread mitzuteilen, dass er die Ausführung stoppen soll.

Beachten Sie, dass pthread_kill (...) den empfangenden Thread nicht tatsächlich beendet, sondern stattdessen ein Signal an ihn sendet und von den Signal- und Signalhandlern abhängt, was passiert.

54
Antti Huima

Es gibt zwei Ansätze für dieses Problem.

  • Verwenden Sie ein signal : Der Thread installiert einen Signalhandler mit sigaction(), der ein Flag setzt, und der Thread überprüft das Flag regelmäßig, um zu sehen, ob es beendet werden muss. Wenn der Thread beendet werden muss, geben Sie das Signal mit pthread_kill() an ihn ab und warten Sie mit pthread_join() auf seine Beendigung. Dieser Ansatz erfordert eine Vorsynchronisierung zwischen dem übergeordneten Thread und dem untergeordneten Thread, um sicherzustellen, dass der untergeordnete Thread den Signalhandler bereits installiert hat, bevor er das Beendigungssignal verarbeiten kann.
  • Verwenden Sie eine Annullierungsstelle : Der Thread wird beendet, wenn eine Annullierungsfunktion ausgeführt wird. Wenn der Thread beendet werden muss, führen Sie pthread_cancel() aus und warten Sie mit pthread_join() auf seine Beendigung. Dieser Ansatz erfordert eine detaillierte Verwendung von pthread_cleanup_Push() und pthread_cleanup_pop(), um Ressourcenlecks zu vermeiden. Diese letzten beiden Aufrufe können sich mit dem lexikalischen Geltungsbereich des Codes beschäftigen (da dies Makros sein können, die {- und }-Token ergeben), und es ist sehr schwierig, sie ordnungsgemäß zu verwalten.

(Beachten Sie, dass Sie, wenn Sie den Thread bereits mit pthread_detach() gelöst haben, nicht erneut mit pthread_join() beitreten können.)

Beide Ansätze können sehr knifflig sein, aber beide können in bestimmten Situationen besonders nützlich sein.

21
alecov

Ich stimme mit Antti überein. Besser wäre es, einige Kontrollpunkte zu implementieren, an denen der Thread prüft, ob er beendet werden soll. Diese Prüfpunkte können auf verschiedene Weise implementiert werden, z. B. eine gemeinsam genutzte Variable mit Sperre oder ein Ereignis, das der Thread prüft, ob er gesetzt ist (der Thread kann sich dazu entschließen, eine Nullzeit zu warten).

6
Fredrik Jansson

Schauen Sie sich die Funktion pthread_kill() an.

3
Wyzard
pthread_exit(0) 

Dadurch wird der Thread abgebrochen.

0
Anand Paul