Esto imprimirá una representación hexadecimal de un pthread_t
, no importa lo que sea en realidad:
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]));
}
}
Para imprimir una pequeña identificación para cada pthread_t
se podría usar algo como esto (esta vez 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];
}
Dependiendo de la plataforma y la representación real de pthread_t
aquí podría ser necesario definir un operator<
para pthread_t
, porque std::map
necesita un orden en los elementos:
bool operator<(const pthread_t &left, const pthread_t &right) {
...
}
GDB usa el id de subproceso (también conocido como kernel pid, también conocido como LWP) para números cortos en Linux. Prueba:
#include <syscall.h>
...
printf("tid = %d\n", syscall(SYS_gettid));
En este caso depende del sistema operativo, ya que el estándar POSIX ya no requiere pthread_t
ser un tipo aritmético:
IEEE Std 1003.1-2001/Cor 2-2004, se aplica el elemento XBD/TC2/D6/26, agregando pthread_t
a la lista de tipos que no se requieren para ser tipos aritméticos, lo que permite pthread_t
ser definido como una estructura.
Deberá buscar en su sys/types.h
encabezado y vea cómo pthread_t
está implementado; luego puedes imprimirlo como mejor te parezca. Dado que no hay una forma portátil de hacer esto y no dices qué sistema operativo estás usando, no hay mucho más que decir.
Editar: para responder a su nueva pregunta, GDB asigna sus propios identificadores de subprocesos cada vez que se inicia un nuevo subproceso:
Para fines de depuración, gdb asocia su propio número de subproceso, siempre un número entero, con cada subproceso de su programa.
Si está buscando imprimir un número único dentro de cada hilo, su opción más limpia probablemente sería decirle a cada hilo qué número usar cuando lo inicia.