Cela imprimera une représentation hexadécimale d'un pthread_t
, peu importe ce que c'est réellement :
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]));
}
}
Pour imprimer simplement un petit identifiant pour chaque pthread_t
quelque chose comme ceci pourrait être utilisé (cette fois en utilisant 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];
}
Selon la plate-forme et la représentation réelle de pthread_t
il peut être nécessaire ici de définir un operator<
pour pthread_t
, car std::map
a besoin d'un ordre sur les éléments :
bool operator<(const pthread_t &left, const pthread_t &right) {
...
}
GDB utilise le thread-id (alias kernel pid, alias LWP) pour les nombres courts sous Linux. Essayez :
#include <syscall.h>
...
printf("tid = %d\n", syscall(SYS_gettid));
Dans ce cas, cela dépend du système d'exploitation, puisque la norme POSIX n'exige plus pthread_t
être un type arithmétique :
IEEE Std 1003.1-2001/Cor 2-2004, l'article XBD/TC2/D6/26 est appliqué, en ajoutant
pthread_t
à la liste des types qui ne sont pas tenus d'être des types arithmétiques, permettant ainsipthread_t
à définir comme une structure.
Vous devrez regarder dans votre sys/types.h
en-tête et voyez comment pthread_t
est implémenté; alors vous pouvez l'imprimer comme bon vous semble. Puisqu'il n'y a pas de moyen portable de le faire et que vous ne dites pas quel système d'exploitation vous utilisez, il n'y a pas grand-chose de plus à dire.
Modifier : pour répondre à votre nouvelle question, GDB attribue ses propres identifiants de thread à chaque démarrage d'un nouveau thread :
À des fins de débogage, gdb associe son propre numéro de thread (toujours un seul entier) à chaque thread de votre programme.
Si vous envisagez d'imprimer un numéro unique à l'intérieur de chaque thread, votre option la plus propre serait probablement de dire à chaque thread quel numéro utiliser lorsque vous le démarrez.