pthread_t
ist weder eine Thread-ID noch ein numerischer Index. Es ist ein undurchsichtiger Typ. Das Erfinden von Werten kann zu einem Absturz führen.
Unter Linux NPTL wird pthread_t als Zeiger verwendet:
int
__pthread_kill (threadid, signo)
pthread_t threadid;
int signo;
{
struct pthread *pd = (struct pthread *) threadid;
Es sollte schon ziemlich klar sein, wo die Dinge schief laufen :) Die ältere Linuxthreads-Implementierung verwendete numerische Indizes in einer Tabelle, und dort konnte man tatsächlich TIDs erfinden, ohne einen Absturz zu erwarten.
Sie müssen das Thema Leben und Tod selbst verfolgen. A pthread_t
ist gültig, bis Sie die pthread_join
erfolgreich zu verwenden. Wenn Sie testen möchten, ob ein gültig pthread_t
lebendig ist, rufen Sie pthread_tryjoin_np
auf ihn; wenn er EBUSY
ist der Thread aktiv. Wenn die Funktion erfolgreich ist, _die pthread_t
ist nicht mehr gültig_ Sie müssen also irgendwo vermerken, dass dieser Thread jetzt tot ist und nicht mehr überprüft zu werden braucht!
Sie könnten natürlich auch Ihr eigenes Verfolgungssystem implementieren - erstellen Sie irgendwo eine Tabelle für das Vorhandensein von TIDs, ein System für die Vergabe von TIDs und die Weitergabe an neu erstellte Threads. Jeder Thread sollte sich selbst als tot markieren, bevor er beendet wird (vielleicht mit pthread_cleanup_push
damit Sie den Threadabbruch und die pthread_exit
), und lösen Sie den Faden ab, damit Sie ihn nicht verbinden müssen (mit pthread_detach
). Jetzt haben Sie die explizite Kontrolle über Ihre Thread-Death-Meldungen.
0 Stimmen
Welche "ungültigen" Werte verwenden Sie?
0 Stimmen
Da pthread_t ein undurchsichtiger Typ ist, könnte die Verwendung einer Ganzzahl (wie 1001) theoretisch zu Problemen und einem nachfolgenden Absturz führen. Erhalten Sie beim Kompilieren mit -Wall irgendwelche Warnungen?
0 Stimmen
Haben Sie das Programm unter valgrind laufen lassen?
0 Stimmen
Ignorieren Sie meinen vorherigen Kommentar, ich habe mir die alte linuxthreads-Implementierung angesehen :)
0 Stimmen
@DanFego Leider überhaupt keine Warnungen :(