GNU/Linux >> Belajar Linux >  >> Linux

ID utas yang dikembalikan oleh pthread_self() tidak sama dengan ID utas kernel yang dikembalikan oleh panggilan ke gettid(2)

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


Linux
  1. Apakah Subkulit Sama Dengan Cangkang Anak?

  2. Mengapa `md5sum` Tidak Memberikan Hash yang Sama Seperti Internet?

  3. Mengapa kernel dipetakan ke ruang alamat yang sama dengan proses?

  1. Bagaimana saya bisa menjalankan perintah yang berbeda tetapi dengan argumen yang sama?

  2. Bagaimana cara menetapkan alamat IP statis yang berbeda ke mesin yang sama tergantung pada OS-nya?

  3. vmlinuz dan initrd tidak ditemukan setelah membangun kernel?

  1. Apakah mungkin untuk berbagi file antara 2 os berbeda di komputer yang sama?

  2. Mengapa nomor panggilan sistem Linux di x86 dan x86_64 berbeda?

  3. Bagaimana cara mengarahkan subdomain ke port lain di server yang sama?