GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara mendapatkan id utas dari pthread di program linux c?

Apa? Orang tersebut meminta khusus Linux, dan setara dengan getpid(). Bukan BSD atau Apple. Jawabannya adalah gettid() dan mengembalikan tipe integral. Anda harus memanggilnya menggunakan syscall(), seperti ini:

#include <sys/types.h>
#include <unistd.h>
#include <sys/syscall.h>

 ....

 pid_t x = syscall(__NR_gettid);

Meskipun ini mungkin tidak portabel untuk sistem non-linux, threadid dapat dibandingkan secara langsung dan sangat cepat diperoleh. Itu dapat dicetak (seperti untuk LOG) seperti bilangan bulat normal.


Seperti disebutkan dalam jawaban lain, pthreads tidak menentukan cara platform-independen untuk mengambil ID utas integral.

Pada sistem Linux, Anda bisa mendapatkan ID utas sebagai berikut:

#include <sys/types.h>
pid_t tid = gettid();

Pada banyak platform berbasis BSD, jawaban ini https://stackoverflow.com/a/21206357/316487 memberikan cara yang tidak portabel.

Namun, jika alasan Anda merasa memerlukan ID utas adalah untuk mengetahui apakah Anda menjalankan utas yang sama atau berbeda dengan utas lain yang Anda kontrol, Anda mungkin menemukan beberapa utilitas dalam pendekatan ini

static pthread_t threadA;

// On thread A...
threadA = pthread_self();

// On thread B...
pthread_t threadB = pthread_self();
if (pthread_equal(threadA, threadB)) printf("Thread B is same as thread A.\n");
else printf("Thread B is NOT same as thread A.\n");

Jika Anda hanya perlu mengetahui apakah Anda berada di utas utama, ada cara tambahan, yang didokumentasikan dalam jawaban atas pertanyaan ini, bagaimana cara mengetahui apakah pthread_self adalah utas utama (pertama) dalam proses?.


pid_t tid = syscall(SYS_gettid);

Linux menyediakan panggilan sistem semacam itu untuk memungkinkan Anda mendapatkan id dari sebuah utas.


pthread_self() fungsi akan memberikan id utas dari utas saat ini.

pthread_t pthread_self(void);

pthread_self() fungsi mengembalikan pegangan Pthread dari utas panggilan. Fungsi pthread_self() TIDAK mengembalikan utas integral dari utas panggilan. Anda harus menggunakan pthread_getthreadid_np() untuk mengembalikan pengidentifikasi integral untuk utas.

CATATAN:

pthread_id_np_t   tid;
tid = pthread_getthreadid_np();

jauh lebih cepat daripada panggilan ini, tetapi memberikan perilaku yang sama.

pthread_id_np_t   tid;
pthread_t         self;
self = pthread_self();
pthread_getunique_np(&self, &tid);

Linux
  1. Cara Membuat Thread di Linux (Dengan Program Contoh C)

  2. Bagaimana cara mendapatkan nama host dari IP (Linux)?

  3. Bagaimana cara mendapatkan netmask dari bash?

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

  2. Cara mendapatkan ukuran direktori di Linux

  3. Bagaimana memberi nama utas di Linux?

  1. AVR - Cara memprogram chip AVR di Linux

  2. Bagaimana cara mengetahui di mana suatu program macet di linux?

  3. Bagaimana cara mendapatkan ldapsearch di Scientific Linux?