Dadurch wird eine hexadezimale Darstellung von pthread_t
ausgegeben , egal was das eigentlich ist:
void fprintPt(FILE *f, pthread_t pt) {
unsigned char *ptc = (unsigned char*)(void*)(&pt);
fprintf(f, "0x");
for (size_t i=0; i<sizeof(pt); i++) {
fprintf(f, "%02x", (unsigned)(ptc[i]));
}
}
Um einfach eine kleine ID für jeden pthread_t
zu drucken so etwas könnte verwendet werden (diesmal mit iostreams):
void printPt(std::ostream &strm, pthread_t pt) {
static int nextindex = 0;
static std::map<pthread_t, int> ids;
if (ids.find(pt) == ids.end()) {
ids[pt] = nextindex++;
}
strm << ids[pt];
}
Abhängig von der Plattform und der tatsächlichen Darstellung von pthread_t
ggf. muss hier ein operator<
definiert werden für pthread_t
, weil std::map
benötigt eine Ordnung der Elemente:
bool operator<(const pthread_t &left, const pthread_t &right) {
...
}
GDB verwendet die Thread-ID (auch bekannt als Kernel-PID, auch bekannt als LWP) für kurze Nummern unter Linux. Versuchen Sie:
#include <syscall.h>
...
printf("tid = %d\n", syscall(SYS_gettid));
In diesem Fall hängt es vom Betriebssystem ab, da der POSIX-Standard pthread_t
nicht mehr benötigt ein arithmetischer Typ sein:
IEEE Std 1003.1-2001/Cor 2-2004, Artikel XBD/TC2/D6/26 wird angewendet, wobei pthread_t
hinzugefügt wird in die Liste der Typen, die keine arithmetischen Typen sein müssen, wodurch pthread_t
zugelassen wird als Struktur zu definieren.
Sie müssen in Ihrem sys/types.h
nachsehen Header und sehen Sie, wie pthread_t
ist implementiert; dann kannst du es ausdrucken wie du es für richtig hältst. Da es dafür keine portable Möglichkeit gibt und Sie nicht angeben, welches Betriebssystem Sie verwenden, gibt es nicht viel mehr zu sagen.
Bearbeiten: Um Ihre neue Frage zu beantworten, weist GDB jedes Mal, wenn ein neuer Thread beginnt, seine eigene Thread-ID zu:
Zu Debugging-Zwecken ordnet gdb jedem Thread in Ihrem Programm seine eigene Thread-Nummer – immer eine einzelne Ganzzahl – zu.
Wenn Sie eine eindeutige Nummer in jeden Thread drucken möchten, wäre Ihre sauberste Option wahrscheinlich, jedem Thread zu sagen, welche Nummer er verwenden soll, wenn Sie ihn starten.