Segmentierungsfehler verursacht durch pthread_kill

8

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?

    
Terry Li 12.12.2011, 23:15
quelle

2 Antworten

14

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.

    
bdonlan 13.12.2011, 01:38
quelle
1

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%     
Joshua Clayton 04.06.2013 15:38
quelle