GNU/Linux >> Znalost Linux >  >> Linux

Jak vytisknout pthread_t

Tím se vytiskne hexadecimální reprezentace pthread_t , bez ohledu na to, co to ve skutečnosti je:

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

Stačí vytisknout malé ID pro každý pthread_t něco takového by se dalo použít (tentokrát pomocí iostreamů):

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

V závislosti na platformě a skutečné reprezentaci pthread_t zde může být nutné definovat operator< pro pthread_t , protože std::map potřebuje uspořádání prvků:

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

GDB používá pro krátká čísla v Linuxu ID vlákna (také známý jako kernel pid, aka LWP). Zkuste:

  #include <syscall.h>
  ...

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

V tomto případě záleží na operačním systému, protože standard POSIX již nevyžaduje pthread_t být aritmetický typ:

IEEE Std 1003.1-2001/Cor 2-2004, položka XBD/TC2/D6/26 je použita, přidává se pthread_t na seznam typů, které nemusí být aritmetickými typy, což umožňuje pthread_t být definován jako struktura.

Budete se muset podívat do svého sys/types.h záhlaví a podívejte se, jak pthread_t je implementován; pak si to můžete vytisknout, jak uznáte za vhodné. Vzhledem k tomu, že neexistuje přenosný způsob, jak to udělat, a neuvádíte, jaký operační systém používáte, není k tomu více co říci.

Upravit: k zodpovězení vaší nové otázky přiřadí GDB svá vlastní ID vlákna pokaždé, když začne nové vlákno:

Pro účely ladění přiřazuje gdb každému vláknu ve vašem programu své vlastní číslo vlákna – vždy jedno celé číslo.

Pokud se díváte na tisk jedinečného čísla uvnitř každého vlákna, nejčistší možností by pravděpodobně bylo říci každému vláknu, jaké číslo má při jeho spuštění použít.


Linux
  1. Jak vytisknout proměnnou s vycpaným zarovnáním na střed?

  2. Jak zkontrolovat, zda Bash může tisknout barvy?

  3. Jak ukončit vlákno v programu C ( příklad pthread_exit )

  1. Jak se připojit k vláknu, které visí na blokování IO?

  2. Jak nastavit název vlákna v Linuxu pthreads?

  3. Jak vytisknout číslo v sestavě NASM?

  1. Jak pěkně vytisknout soubor JSON v terminálu Linux

  2. Jak dostat ps do tiskové skupiny?

  3. Jak vytisknout zjevně skryté proměnné prostředí?