Ini akan mencetak representasi heksadesimal dari pthread_t
, apa pun itu sebenarnya:
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]));
}
}
Untuk mencetak id kecil untuk setiap pthread_t
sesuatu seperti ini dapat digunakan (kali ini menggunakan 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];
}
Bergantung pada platform dan representasi sebenarnya dari pthread_t
di sini mungkin perlu untuk mendefinisikan operator<
untuk pthread_t
, karena std::map
membutuhkan pemesanan pada elemen:
bool operator<(const pthread_t &left, const pthread_t &right) {
...
}
GDB menggunakan thread-id (alias kernel pid, alias LWP) untuk nomor pendek di Linux. Coba:
#include <syscall.h>
...
printf("tid = %d\n", syscall(SYS_gettid));
Dalam hal ini, tergantung pada sistem operasi, karena standar POSIX tidak lagi memerlukan pthread_t
menjadi tipe aritmatika:
IEEE Std 1003.1-2001/Cor 2-2004, item XBD/TC2/D6/26 diterapkan, menambahkan
pthread_t
ke daftar tipe yang tidak diharuskan menjadi tipe aritmatika, sehingga memungkinkanpthread_t
untuk didefinisikan sebagai struktur.
Anda perlu melihat sys/types.h
Anda tajuk dan lihat bagaimana pthread_t
diimplementasikan; kemudian Anda dapat mencetaknya sesuai keinginan Anda. Karena tidak ada cara portabel untuk melakukan ini dan Anda tidak mengatakan sistem operasi apa yang Anda gunakan, tidak banyak lagi yang bisa dikatakan.
Edit: untuk menjawab pertanyaan baru Anda, GDB menetapkan id utasnya sendiri setiap kali utas baru dimulai:
Untuk tujuan debug, gdb mengaitkan nomor utasnya sendiri—selalu bilangan bulat tunggal—dengan setiap utas dalam program Anda.
Jika Anda ingin mencetak nomor unik di dalam setiap utas, opsi terbersih Anda mungkin adalah memberi tahu setiap utas nomor yang akan digunakan saat Anda memulainya.