Jadi, atas dasar apa saya harus memutuskan apakah saya harus menggunakan pthread_self ataugettid untuk menentukan utas mana yang menjalankan fungsi?
Anda harus selalu menggunakan pthread_self()
kapan pun Anda ingin mengidentifikasi utas dalam aplikasi Anda. gettid()
bisa digunakan untuk tujuan tertentu dan jika Anda tahu itu Linux. Misalnya, gettid()
dapat digunakan untuk mendapatkan seed untuk seed khusus thread (digunakan dalam srand()
).
Keduanya tidak portabel.
Ini tidak sepenuhnya benar. gettid()
tidak portabel karena ini adalah fungsi khusus Linux. Tapi pthread_self()
portabel selama Anda tidak membuat asumsi apa pun tentang representasinya.
Misalnya, berikut ini tidak portabel.
printf("Thread ID is: %ld", (long) pthread_self());
karena tidak ada jaminan bahwa apapun pthread_self()
akan menjadi semacam bilangan bulat. Tapi
pthread_t my_tid; //filled elsewhere
pthread_t tid = pthread_self();
if( pthread_equal(my_tid, tid) ) {
/* do stuff */
}
sepenuhnya portabel.
Yang pertama tidak portabel karena menganggap id utas itu adalah bilangan bulat sedangkan yang terakhir bukan.
Mengapa ada dua fungsi berbeda untuk mendapatkan ID utas?
Mereka bukan dua cara berbeda untuk mendapatkan nilai yang sama. Satu (pthread_self()
disediakan oleh pustaka utas (pthreads) sedangkan yang lain (gettid()
adalah fungsi khusus OS. OS yang berbeda dapat menyediakan antarmuka/syscall yang berbeda untuk mendapatkan ID utas yang mirip dengan gettid()
. Jadi Anda tidak bisa mengandalkan gettid()
dalam aplikasi portabel.
pthread_self() returns the process-wide unique pthread-id.
gettid() mengembalikan thread-id unik seluruh sistem (khusus implementasi pthread) (di Linux).
the TID(thread id) returned by gettid() is unique inside a process
Ya.
(or inside a program with multiple processes,
Ya.
inside a process, different thread has different thread id.
Ya.
the TID returned by pthread_self() is unique across processes,
Tidak.
different thread has different TID on the same machine at the same time.
Ya dalam proses yang sama, Tidak di seluruh mesin.
Karena gettid() spesifik untuk Linux dan karena itu tidak portabel, satu-satunya cara untuk mengidentifikasi pthread secara luas adalah dengan menggunakan id proses induknya (unik seluruh sistem) seperti yang dikembalikan oleh getpid() bersama dengan pthread-nya (unik di seluruh proses). id seperti yang dikembalikan oleh pthread_self().
Ini adalah studi yang menarik tentang perbedaan antara konseptual terminologi dan entitas perangkat lunak yang sebenarnya (yang termasuk dalam abstraksi perangkat lunak tertentu).
Pertama-tama, perhatikan jenisnya dari dua panggilan ini.
pid_t gettid(void);
pthread_t pthread_self(void);
Salah satunya adalah pid_t
dan yang lainnya adalah pthread_t
. Keduanya mengacu pada entitas konseptual umum yang disebut thread
, tetapi tipe yang berbeda menyiratkan bahwa ini adalah dua software entities
yang berbeda . Mereka adalah representasi berbeda dari thread id
, dan masuk akal dalam abstraksi perangkat lunak yang menggabungkannya. Jadi, pthread_t
masuk akal hanya dalam abstraksi yang didukung oleh pthread
paket, dan pid_t
masuk akal dalam abstraksi yang menggabungkan jenis ini (yaitu panggilan sistem Linux yang berhubungan dengan pid_t
).
Anda harus menggunakan jenis yang benar berdasarkan konteksnya. Gunakan pthread_t
dalam konteks yang membutuhkan tipe pthread_t
dan pid_t
dalam konteks yang membutuhkan pid_t
- terlepas dari fakta bahwa mereka mungkin merujuk ke utas yang sama.
Masing-masing dari konteks ini telah menentukan sintaksis untuk perbandingan dan kesetaraan. pid_t
dapat langsung dibandingkan dengan ==
operator, sedangkan pthread_t
harus dibandingkan dengan memanggil pthread_equal
.
Alasan representasi ganda / abstraksi perangkat lunak ini adalah pthread
library adalah library thread portabel yang dapat diimplementasikan pada sistem operasi yang berbeda. Implementasi berbeda dari pthread
perpustakaan menjamin bahwa thread id
ketik akan selalu pthread_t
. Utas ini dapat dipetakan di bawahnya ke thread entity
khusus sistem operasi pengenal OS-nya bergantung pada sistem operasi (mis. untuk Linux adalah pid_t
; untuk Windows adalah DWORD
).
Jadi, meskipun implementasi dasarnya mungkin berbeda dari satu OS ke OS lainnya, kode ditulis berdasarkan pthread
abstraksi tetap portabel di seluruh OS (selama Anda membatasi diri pada pthread
abstraksi).