GNU/Linux >> Tutoriels Linux >  >> Linux

Comment imprimer pthread_t

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 ainsi pthread_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.


Linux
  1. Comment imprimer un fichier JSON dans un terminal Linux

  2. Comment imprimer les lignes numéro 15 et 25 sur 50 lignes ?

  3. Comment rejoindre un fil qui bloque le blocage des E/S ?

  4. Comment nommer un thread sous Linux ?

  5. Comment définir le nom d'un thread dans les pthreads Linux ?

Bash printf - Comment imprimer une variable dans Bash

Comment configurer le serveur d'impression CUPS sur Ubuntu 20.04

Comment obtenir l'identifiant de thread d'un pthread dans le programme linux c?

Comment imprimer la sortie de la commande Linux dans un fichier ?

Comment annuler la commande de décompression ?

Comment imprimer le contenu des travaux at ?