2009-11-07 32 views
23

Wie stelle ich fest, ob ein losgelöster Pthread immer noch lebendig ist?Wie kann ich feststellen, ob ein Pthread am Leben ist?

Ich habe einen Kommunikationskanal mit dem Thread (eine uni-direktionale Warteschlange nach außen aus dem Thread) aber was passiert, wenn der Thread stirbt ohne Keuchen?

Soll ich mich damit abfinden, mit Prozess Signale oder kann ich Sonde für Faden Lebendigkeit irgendwie?

Antwort

19

Sie können pthread_kill wie folgt verwenden:

int ret = pthread_kill(YOUR_PTHREAD_ID, 0); 

Wenn Sie einen ESRCH Wert zu erhalten, könnte es der Fall sein, dass der Thread tot ist.

UPDATE: anscheinend ist meine Antwort falsch. Ich kann es nicht löschen, da es eine akzeptierte Antwort ist.

Aus den Kommentaren:

The answer is wrong because if the thread is detached and is not alive, the pthread_t is invalid. You can't pass it to pthread_kill. It could, for example, be a pointer to a structure that was freed, causing your program to crash. POSIX says, "A conforming implementation is free to reuse a thread ID after its lifetime has ended. If an application attempts to use a thread ID whose lifetime has ended, the behavior is undefined." – Thanks @DavidSchwartz

+0

Kurz und gut ... danke! – jldupont

+5

Das Problem damit ist, dass die 'YOUR_PTHREAD_ID' inzwischen für einen anderen Thread wiederverwendet worden sein könnte, seit sie gelöst wurde. Es sollte also eher sein: __Wenn Sie ESRCH erhalten, ist Ihr Thread tot, sonst können Sie nicht sicher sein__ (es sei denn, Sie kennen die IDs der neu erstellten Threads). – RedGlyph

+0

@RedGlyph: Dies ist ein sehr typischer Fall von Identifikator Recycling-Rätsel.In meinem Fall bin ich bereit, mit der geringen Wahrscheinlichkeit einer Kollision zu leben, da ich auf einer angemessenen Frequenz abfragen werde. – jldupont

9

Diese Frage geht von einem Entwurf mit unvermeidlichen Wettlaufbedingungen aus.

Vermutlich planen Sie so etwas wie dies zu tun:

  1. Überprüfen Sie, ob Thread
  2. Warten auf Nachricht von Thread am Leben ist

Das Problem ist, dass diese Sequenz nicht atomar und kann nicht behoben werden. Was passiert, wenn der von Ihnen getestete Thread zwischen Schritt (1) und Schritt (2) nicht mehr existiert?

Race-Bedingungen sind böse; seltene Race-Bedingungen doppelt so. Tapezieren über etwas 90% zuverlässig mit etwas 99,999% zuverlässig ist eine der schlimmsten Entscheidungen, die Sie treffen können.

Die richtige Antwort auf Ihre Frage ist "Tu das nicht". Fixieren Sie Ihre Anwendung stattdessen so, dass Threads nicht zufällig versterben.

Wenn das nicht möglich ist und einige Threads anfällig für Abstürze sind, und Sie müssen sich davon erholen ... Dann ist Ihr Design grundlegend fehlerhaft und Sie sollten keinen Thread verwenden. Setzen Sie dieses unzuverlässige Ding in einen anderen Prozess und verwenden Sie ein Rohr, um mit ihm stattdessen zu kommunizieren. Der Prozess Tod schließt Dateideskriptoren und das Lesen einer Pipe, deren anderes Ende geschlossen wurde, hat ein klar definiertes, leicht zu erkennendes, rennfreies Verhalten.

+0

Das Problem wurde durch eine Abschaltprozedur verursacht und nicht durch eine Notfallwiederherstellung. – jldupont

Verwandte Themen