21 Aralık 2015 Pazartesi

pthread_self() ile gettid() arasındaki fark

Not : Bu yazı ile ilgili olarak ACE_Thread_Manager ile yeni thread yaratmak başlıklı yazıya göz atabilirsiniz.

Posix ve Linux Threadleri arasındaki fark

pthread kütüphanesi linux üzerinde glibc tarafından implement edilmiştir. glibc bu gerçekleştirime NPTL (Native Posix Thread Library) adını vermiştir.

pthread kütüphanesinde bulunan pthread_self() metodu bir thread ID değeri döndürmekte ancak bu değer kütüphane tarafından üretilen yapay bir değer. Metodun imzası şöyle.
pthread_t pthread_self(void);
Şöyle kullanırız.
pthread_t tid = pthread_self();
pthread_equal metodu
pthread_t tipinin ne olduğu belirisiz. long'da olabilir bir struct'ta olabilir.
Thread identifiers should be considered opaqueany attempt to use a thread ID other than in pthreads calls is nonportable and can lead to unspecified results.
Thread IDs are only guaranteed to be unique within a process. A thread ID may be reused after a terminated thread has been joined, or a detached thread has terminated.
The thread ID returned by pthread_self() is not the same thing as the kernel thread ID returned by a call to gettid(2).

Dolayısıyla aşağıdaki kod portable olmayabilir.
printf("Thread ID is: %ld", (long) pthread_self());
pthread_t bir çok platformda uintptr_t olarak gerçekleştiriliyor. Bu tipin ne olduğunu bilmeksizin iki pthread_t tipini karşılaştırmak için şöyle yaparız.
pthread_t my_tid; //filled elsewhere

pthread_t tid = pthread_self();

if( pthread_equal(my_tid, tid) ) {
   /* do stuff */
}

gettid metodu
Linux çekirdeği de her thread için bir thread ID değeri üretmekte. Bu değer gettid() metoduyla alınabilir. Metodun imzası şöyle
pid_t gettid(void);
Dikkat edilmesi gereken nokta pthread_self() ile gettid() metodlarını aynı değerleri döndürmezler.
Buradaki soruda da benzer bir cevap var ve gettid() man sayfasından da çok net bir açıklama var.

Linux kernel metodlarını pthread_self()'in verdiği thread ID değeri ile çağıramayız çünkü bu değer pthread kütüphanesine mahsus bir sayı ve Linux çekirdeği bu sayıdan habersiz !

Linux tarafından üretilen thread ID'sini görmek için "ps -L" metodunu kullanırsak buradan aldığım örnekteki gibi bir şey görürüz.



Aradaki farkı vurgulamak için boost thread kütüphanesindeki native_handle() metoduna da dikkat etmek gerekir Bu metod ile yukarıda bahsettiğim işletim sistemi tarafından verilen değeri alabilmek mümkün. 

Bir çok POSIX metodu pthread_self() metoduna ihtiyaç duymaktadır. Örneğin pthread_setaffinity_np metodu için aşağıdaki kod parçası kullanılabilir.

#include "pthread.h"
#include "sched.h"

int affinity = 3; //core id
pthread_t mythread = pthread_self();
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(affinity, &cpuset); //lets kernel know only core affinity may run this thread
if (pthread_setaffinity_np(mythread, sizeof(cpu_set_t), &cpuset) <0){
    perror("sched_set_affinity");
}

Hiç yorum yok:

Yorum Gönder