GNU/Linux >> Belajar Linux >  >> Linux

Cara mencetak pthread_t

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 memungkinkan pthread_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.


Linux
  1. Cara Mencetak File JSON dengan Cantik di Terminal Linux

  2. Bagaimana Cara Mencetak Variabel Dengan Perataan Pusat Empuk?

  3. Bagaimana Cara Memeriksa Apakah Bash Dapat Mencetak Warna?

  1. Bagaimana cara mengatur nama utas di Linux pthreads?

  2. Bagaimana cara mencetak nomor di perakitan NASM?

  3. Bagaimana cara mendapatkan ps untuk mencetak grup?

  1. Bagaimana Cara Mencetak Baris Nomor 15 Dan 25 Dari Setiap 50 Baris?

  2. Cara Mengakhiri Thread dalam Program C ( Contoh pthread_exit )

  3. Bagaimana cara mencetak konten di pekerjaan?