Diese Frage geht von einem Entwurf mit unvermeidlichen Wettlaufbedingungen aus.
Vermutlich planen Sie so etwas wie dies zu tun:
- Überprüfen Sie, ob Thread
- 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.
Kurz und gut ... danke! – jldupont
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
@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