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);