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žňujepthread_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.