GNU/Linux >> Linux Esercitazione >  >> Linux

Come stampare pthread_t

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.


Linux
  1. Come stampare una variabile con allineamento centrale imbottito?

  2. Come stampare le righe numero 15 e 25 su ogni 50 righe?

  3. Come verificare se Bash può stampare i colori?

  4. Come terminare un thread nel programma C ( pthread_exit Esempio )

  5. Come partecipare a un thread sospeso sul blocco dell'IO?

Bash printf - Come stampare una variabile in Bash

Come configurare CUPS Print Server su Ubuntu 20.04

Come nominare un thread in Linux?

Come stampare dalla terza colonna all'ultima colonna?

Come ottenere ps per stampare il gruppo?

Come stampare l'output del comando Linux su un file?