GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo imprimir pthread_t

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.


Linux
  1. Cómo imprimir bastante el archivo JSON en la terminal de Linux

  2. ¿Cómo imprimir las líneas número 15 y 25 de cada 50 líneas?

  3. ¿Cómo verificar si Bash puede imprimir colores?

  4. Cómo terminar un subproceso en un programa C (ejemplo de pthread_exit)

  5. ¿Cómo unirse a un hilo que está pendiente de bloquear IO?

Bash printf - Cómo imprimir una variable en Bash

Cómo configurar el servidor de impresión CUPS en Ubuntu 20.04

¿Cómo imprimir la salida del comando Linux en un archivo?

¿Cómo deshacer el comando descomprimir?

¿Cómo imprimir variables de entorno aparentemente ocultas?

¿Cómo imprimo el contenido de los trabajos?