Questo stamperà una rappresentazione esadecimale di un pthread_t
, non importa cosa sia effettivamente:
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]));
}
}
Per stampare solo un piccolo ID per ogni pthread_t
potrebbe essere usato qualcosa del genere (questa volta usando 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];
}
A seconda della piattaforma e dell'effettiva rappresentazione di pthread_t
potrebbe essere qui necessario definire un operator<
per pthread_t
, perché std::map
necessita di un ordinamento sugli elementi:
bool operator<(const pthread_t &left, const pthread_t &right) {
...
}
GDB usa il thread-id (aka kernel pid, aka LWP) per i numeri brevi su Linux. Prova:
#include <syscall.h>
...
printf("tid = %d\n", syscall(SYS_gettid));
In questo caso dipende dal sistema operativo, poiché lo standard POSIX non richiede più pthread_t
essere un tipo aritmetico:
Si applica IEEE Std 1003.1-2001/Cor 2-2004, item XBD/TC2/D6/26, aggiungendo
pthread_t
all'elenco dei tipi che non devono necessariamente essere tipi aritmetici, consentendo cosìpthread_t
da definire come una struttura.
Dovrai guardare nel tuo sys/types.h
header e vedere come pthread_t
è implementato; quindi puoi stamparlo come meglio credi. Dal momento che non esiste un modo portatile per farlo e non dici quale sistema operativo stai utilizzando, non c'è molto altro da dire.
Modifica: per rispondere alla tua nuova domanda, GDB assegna i propri ID thread ogni volta che inizia un nuovo thread:
Per scopi di debug, gdb associa il proprio numero di thread, sempre un singolo numero intero, a ogni thread nel programma.
Se stai cercando di stampare un numero univoco all'interno di ogni thread, la tua opzione più pulita sarebbe probabilmente quella di dire a ogni thread quale numero usare quando lo avvii.