Beenden Sie den Thread in der Pthread-Bibliothek

Lesezeit: 4 Minuten

Benutzeravatar von Sajad Bahmani
Sajad Bahmani

ich benutze pthread_create(&thread1, &attrs, //... , //...); und wenn eine Bedingung aufgetreten ist, müssen Sie diesen Thread beenden, wie Sie dies beenden können?

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 wirklich beendet, sondern stattdessen ein Signal an ihn liefert, und es von dem Signal und den Signalhandlern abhängt, was passiert.

  • Das Problem mit pthread_cancel ist übrigens, dass, wenn Sie es verwenden, der Code, der in dem abgebrochenen Thread ausgeführt wird, Abbruchpunkte verstehen und sicherstellen muss, dass (a) er häufig genug einen trifft, damit er tatsächlich rechtzeitig abgebrochen wird , und (b) es verliert keine Ressourcen, wenn dies passiert. Das ist etwas knifflig, wohingegen wenn Sie eine Nachricht verwenden, es in Ihrem Code schön explizit ist, wann genau der Thread beendet werden kann.

    – Steve Jessop

    18. Januar 2010 um 11:07 Uhr

  • @Steve: Leider pthread_cancel ist der einzig saubere Weg im Bibliothekscode um einen Thread zu unterbrechen, der bei einem Systemaufruf blockiert sein könnte. Die andere Methode besteht darin, einen Interrupting Signal Handler zu installieren und sicherzustellen, dass Ihr gesamter Code darauf vorbereitet ist EINTRaber der Bibliothekscode kann nicht davon ausgehen, dass er das Recht hat, die Signalbehandlung zu ändern oder aufzuerlegen EINTR Umgang mit dem Anrufer.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    24. März 2011 um 17:08 Uhr

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

  • Verwenden 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 er beendet werden muss. Wenn der Thread beendet werden muss, geben Sie ihm das Signal mit aus pthread_kill() und warte auf seine Beendigung mit pthread_join(). Dieser Ansatz erfordert eine Vorsynchronisierung zwischen dem Eltern-Thread und dem Kind-Thread, um sicherzustellen, dass der Kind-Thread den Signalhandler bereits installiert hat, bevor er in der Lage ist, das Beendigungssignal zu verarbeiten;
  • Verwenden ein Abbruchstelle: Der Thread wird immer beendet, wenn eine Abbruchfunktion ausgeführt wird. Wenn der Thread beendet werden muss, führen Sie ihn aus pthread_cancel() und warte auf seine Beendigung mit pthread_join(). Dieser Ansatz erfordert eine detaillierte Verwendung von pthread_cleanup_push() und pthread_cleanup_pop() Ressourcenlecks zu vermeiden. Diese letzten beiden Aufrufe können den lexikalischen Umfang des Codes beeinträchtigen (da es sich möglicherweise um Makros handelt, die nachgeben { und } Token) und sind sehr schwer richtig zu warten.

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

Beide Ansätze können sehr knifflig sein, aber jeder kann in einer bestimmten Situation besonders nützlich sein.

Ich stimme Antti zu, besser wäre es, einige Prüfpunkte zu implementieren, an denen der Thread prüft, ob er beendet werden sollte. Diese Prüfpunkte können auf verschiedene Arten implementiert werden, zB: eine gemeinsam genutzte Variable mit Sperre oder ein Ereignis, das der Thread prüft, ob es gesetzt ist (der Thread kann sich dafür entscheiden, null Zeit zu warten).

  • In den meisten allgemeinen Fällen ist dies absolut richtig. Es gibt jedoch viele Situationen, in denen dies einfach nicht praktikabel ist. Mein aktuelles Projekt ist beispielsweise ein minimaler Texteditor, in dem ich einen eigenen Thread zum Empfangen von Benutzereingaben habe. Seit getch() synchron arbeitet, könnte mein Eingabe-Thread nicht erkennen, dass er beendet werden muss, bis der Benutzer eine andere Taste drückt. Das wäre sehr schlechtes Design. Da der Benutzereingabe-Thread niemals zusätzliche Ressourcen zuweisen muss, ist es viel besser, ihn damit zu beenden pthread_cancel().

    Benutzer5739133

    11. Mai 2020 um 23:02 Uhr

Werfen Sie einen Blick auf die pthread_kill() Funktion.

pthread_exit(0) 

Dadurch wird der Thread beendet.

  • Diese Antwort ist falsch. pthread_exit() ist eine Funktion zum Beenden des Threads, in dem diese Funktion aufgerufen wird. Das ist eine ordentliche Kündigung. pthread_exit() kann nicht verwendet werden, um andere Threads zu beeinflussen. Bitte nicht irreführen.

    – Animesh Kumar

    25. Oktober 2020 um 17:37 Uhr

  • Diese Antwort ist falsch. pthread_exit() ist eine Funktion zum Beenden des Threads, in dem diese Funktion aufgerufen wird. Das ist eine ordentliche Kündigung. pthread_exit() kann nicht verwendet werden, um andere Threads zu beeinflussen. Bitte nicht irreführen.

    – Animesh Kumar

    25. Oktober 2020 um 17:37 Uhr

1408080cookie-checkBeenden Sie den Thread in der Pthread-Bibliothek

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy