GDB sagt mir, dass pthread_kill
einen Segmentierungsfehler in meinem Programm verursacht. Im Grunde verwende ich pthread_kill
, um zu überprüfen, ob ein Thread lebt oder nicht seine ID gegeben hat.
Ich habe im Internet gesucht und festgestellt, dass pthread_kill
möglicherweise einen Segmentierungsfehler verursacht, wenn TID ungültig ist. Ja, ich habe mein Programm mit "ungültigen" TIDs vom Typ int
getestet. Könnte das der wahre Grund sein?
pthread_t
ist keine Thread-ID oder ein numerischer Index. Es ist ein undurchsichtiger Typ. Das Erstellen von Werten kann zu einem Absturz führen.
Unter Linux NPTL wird pthread_t als Zeiger verwendet:
%Vor%Es sollte ziemlich klar sein, wo die Dinge schon schiefgehen :) Beachten Sie, dass diese Pointerness auch ein Implementierungsdetail ist - die ältere Linuxthreads-Implementierung verwendete numerische Indizes in einer Tabelle, und dort könnten Sie tatsächlich TIDs erstellen und Dinge nicht erwarten abstürzen.
Sie müssen Fadenleben und Tod selbst verfolgen. A pthread_t
ist gültig, bis Sie pthread_join
erfolgreich aufrufen. Wenn Sie testen möchten, ob ein gültiges pthread_t
aktiv ist, rufen Sie pthread_tryjoin_np
darauf auf; Wenn es EBUSY
zurückgibt, ist der Thread am Leben. Wenn die Funktion erfolgreich ist, ist pthread_t
nicht mehr gültig ; Du darfst es an dieser Stelle nicht wiederverwenden - also musst du dir irgendwo notieren, dass dieser Thread jetzt tot ist, und du musst es nicht mehr überprüfen!
Sie könnten natürlich Ihr eigenes Tracking-System implementieren - Sie können eine Tabelle für die Lebendigkeit erstellen, ein System für die Verteilung von TIDs und die Übergabe an neu erstellte Threads. Lassen Sie jeden Thread sich selbst vor dem Beenden als tot markieren (vielleicht mit pthread_cleanup_push
, so dass Sie Thread-Absturz und pthread_exit
behandeln), und trennen Sie den Thread, so dass Sie ihm nicht beitreten müssen (mit pthread_detach
). Jetzt haben Sie explizite Kontrolle über Ihre Thread-Death-Berichterstattung.
Um diese Einschränkung in meinem Code zu umgehen, setze ich die TID auf Null, wenn der Code nicht läuft
%Vor%... und prüfen Sie vor dem Aufruf von pthread_kill
auf Null %Vor%Tags und Links c linux pthreads posix segmentation-fault