GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So drucken Sie pthread_t

Dadurch wird eine hexadezimale Darstellung von pthread_t ausgegeben , egal was das eigentlich ist:

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]));
  }
}

Um einfach eine kleine ID für jeden pthread_t zu drucken so etwas könnte verwendet werden (diesmal mit 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];
}

Abhängig von der Plattform und der tatsächlichen Darstellung von pthread_t ggf. muss hier ein operator< definiert werden für pthread_t , weil std::map benötigt eine Ordnung der Elemente:

bool operator<(const pthread_t &left, const pthread_t &right) {
  ...
}

GDB verwendet die Thread-ID (auch bekannt als Kernel-PID, auch bekannt als LWP) für kurze Nummern unter Linux. Versuchen Sie:

  #include <syscall.h>
  ...

    printf("tid = %d\n", syscall(SYS_gettid));

In diesem Fall hängt es vom Betriebssystem ab, da der POSIX-Standard pthread_t nicht mehr benötigt ein arithmetischer Typ sein:

IEEE Std 1003.1-2001/Cor 2-2004, Artikel XBD/TC2/D6/26 wird angewendet, wobei pthread_t hinzugefügt wird in die Liste der Typen, die keine arithmetischen Typen sein müssen, wodurch pthread_t zugelassen wird als Struktur zu definieren.

Sie müssen in Ihrem sys/types.h nachsehen Header und sehen Sie, wie pthread_t ist implementiert; dann kannst du es ausdrucken wie du es für richtig hältst. Da es dafür keine portable Möglichkeit gibt und Sie nicht angeben, welches Betriebssystem Sie verwenden, gibt es nicht viel mehr zu sagen.

Bearbeiten: Um Ihre neue Frage zu beantworten, weist GDB jedes Mal, wenn ein neuer Thread beginnt, seine eigene Thread-ID zu:

Zu Debugging-Zwecken ordnet gdb jedem Thread in Ihrem Programm seine eigene Thread-Nummer – immer eine einzelne Ganzzahl – zu.

Wenn Sie eine eindeutige Nummer in jeden Thread drucken möchten, wäre Ihre sauberste Option wahrscheinlich, jedem Thread zu sagen, welche Nummer er verwenden soll, wenn Sie ihn starten.


Linux
  1. Wie drucke ich eine Variable mit Padded Center Alignment?

  2. Wie überprüfe ich, ob Bash Farben drucken kann?

  3. So beenden Sie einen Thread in einem C-Programm (Beispiel pthread_exit)

  4. Wie setze ich den Namen eines Threads in Linux pthreads?

  5. Wie drucke ich eine Nummer in Assembly NASM?

Bash printf - So drucken Sie eine Variable in Bash

So richten Sie den CUPS-Druckserver unter Ubuntu 20.04 ein

Wie benenne ich einen Thread in Linux?

Wie drucke ich die dritte Spalte bis zur letzten Spalte?

Wie bekomme ich die Thread-ID eines Pthreads im Linux-C-Programm?

Wie drucke ich eine Nachricht an stderr in Go?