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_tna seznam typů, které nemusí být aritmetickými typy, což umožňujepthread_tbý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.