30 Ocak 2015 Cuma

Thread Local Storage

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.
pthread_key_t glob_var_key;
pthread_key_create metodu
Yukarı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
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);
}

pthread_get_specific
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