Thread Local Storage
Thread Local Storage konusu gördüğüm tüm işletim sistemlerinde var.
POSIX
Tüm örneği buradan aldım. POSIX her zamanki gibi kullanması çok zor, karmaşık metodlar sunuyor.
pthread_key nesnesi
Bu nesne bir çeşit key-value eşleştirmesi yapan bir tablo. Şöyle tanımlanıyor. Bu tablo bir çeşit global değişken aslında. Uygulama içinde bir kere tanımlanması gerekir. Storage process için bir kere açılıyor.
Yukarıda tanımlanan tablonun ilklendirilmesi gerekir. Bunun için pthread_key_create metodu kullanılıyor.
pthread_get_specific
Bu metod ile tablo aynı bir array gibi kullanılıyor.
Java
ThreadLocal Sınıfı yazısına taşıdım.
C#
Java gibi ThreadLocal isimli bir sınıf kullanıyor.
Thread Local Storage konusu gördüğüm tüm işletim sistemlerinde var.
POSIX
Tüm örneği buradan aldım. POSIX her zamanki gibi kullanması çok zor, karmaşık metodlar sunuyor.
pthread_key nesnesi
Bu nesne bir çeşit key-value eşleştirmesi yapan bir tablo. Şöyle tanımlanıyor. Bu tablo bir çeşit global değişken aslında. Uygulama içinde bir kere tanımlanması gerekir. Storage process için bir kere açılıyor.
pthread_key_t glob_var_key;
pthread_key_create metoduYukarıda tanımlanan tablonun ilklendirilmesi gerekir. Bunun için pthread_key_create metodu kullanılıyor.
pthread_key_create(&glob_var_key,NULL);
Thread bitince, bu metod ile belirtilen destructor metodu da çağırılır.
pthread_set_specific
pthread_set_specific
Bu metod ile yukarıda tanımlanan tablonun anahtar alanına malloc ile yaratılmış bir alan atanıyor.
void* thread_func(void *arg)
{
int *p = malloc(sizeof(int));
*p = 1;
pthread_setspecific(glob_var_key, p); //Tabloya değer ata
do_something();
do_something();
pthread_setspecific(glob_var_key, NULL); //Tablodaki değeri sil
free(p);
pthread_exit(NULL);
}
Bu metod ile tablo aynı bir array gibi kullanılıyor.
void do_something()
{
//get thread specific data
int* glob_spec_var = (int*) pthread_getspecific(glob_var_key);
printf("value is %d\n", *glob_spec_var);
*glob_spec_var += 1;
printf("value is %d\n", *glob_spec_var);
}
Java
ThreadLocal Sınıfı yazısına taşıdım.
C#
Java gibi ThreadLocal isimli bir sınıf kullanıyor.
Hiç yorum yok:
Yorum Gönder