Evreye Özgü Veri
Önceki POSIX Evreleri Sonraki
Evreye Özgü Veri
Yazılımlarda farklı evrelerde farklı değerlere sahip olan global veya statik değişkenlere sıklıkla ihtiyaç duyulur. Evreler bir bellek alanını paylaştıkları için, bu sıradan değişkenlerle başarılamamaktadır. Evreye özgü veri bu ihtiyaca POSIX evrelerinin cevabıdır.
Her evre bir özel bellek bloğunu, evreye özgü veri alanını veya kısaca EÖV alanını zapteder. Bu alan EÖV anahtarlarıyla indekslenir. EÖV alanı void * türündeki değerleri EÖV anahtarlarıyla ilişkilendirir. EÖV anahtarları bütün evreler için ortaktır, fakat verilen bir EÖV anahtarına ilişkin değer her evre içinde farklı olabilir.
Somut olarak belirtmek gerekirse, EÖV alanları void * göstericilerden oluşan diziler olarak gösterilebilirler, EÖV anahtarları bu diziler için birer tamsayı indisi ve EÖV anahtarının değeri de çağıran evre içindeki ilişkili dizi elemanının değeridir.
Bir evre oluşturulduğunda, onun EÖV alanı ilk başta bütün anahtarlarıyla NULL değerini ilişkilendirir.
int pthread_key_create
((pthread_key_t *anahtar,
 void         (*yıkıcı_işlev) (void *))
işlev
pthread_key_create yeni bir EÖV anahtarı ayırır. Anahtar anahtar ile gösterilen yerde saklanır. Belirli bir süre içinde ayrılabilecek anahtar sayısı PTHREAD_KEYS_MAX ile sınırlandırılmıştır. Döndürülen anahtarla ilişkilendirilmiş değer ilk başta NULLdur.
yıkıcı_işlev argümanı, eğer NULL değilse anahtarla ilişkili bir yıkıcı işlev belirtir. Bir evre pthread_exit ile veya iptal edilerek sonlandığında, evre içindeki anahtarla ilişkili değer üzerine yıkıcı_işlev işlevi çağrılır. Eğer anahtar pthread_key_delete ile silindiyse veya bir değer pthread_setspecific ile değiştirildiyse yıkıcı_işlev çağrılmaz. Yıkıcı işlevin evre sonlandırılma esnasındaki çağrılma sırası belirtilmemiştir.
Yıkıcı işlev çağrılmadan önce, NULL değeri geçerli evre içindeki anahtar ile ilişkilendirilir. Bir yıkıcı işlev NULL olmayan değerleri bu veya başka bir anahtarla tekrar ilişkilendirebilir. Bununla ilgilenmek için, eğer bütün NULL olmayan değerler için bütün yıkıcılar çağrıldıktan sonra, hala NULL olmayan yıkıcılarla ilişkilendirilmiş bazı değerler varsa, süreç tekrarlanır. LinuxThreads gerçeklemesi PTHREAD_DESTRUCTOR_ITERATIONS tekrarlamadan sonra, NULL olmayan tanımlayıcılarla ilişkilendirilmiş değer kalsa bile, süreci durdurur. Diğer uygulamalar sonsuza kadar tekrarlayabilir.
pthread_key_create 0 döndürür, ancak PTHREAD_KEYS_MAX anahtar zaten ayrılmışsa başarısız olur ve EAGAIN döndürür.
int pthread_key_delete
(pthread_key_t anahtar)
işlev
pthread_key_delete bir EÖV anahtarını serbest bırakır. Geçerli süreçteki anahtarla NULL olmayan değerler ilişkilendirilmiş mi kontrol etmediği gibi, anahtarla ilişkili yıkıcı işlevi de çağırmaz.
Eğer anahtar diye bir anahtar yoksa, EINVAL döndürür. Aksi takdirde 0 döndürür.
int pthread_setspecific
(pthread_key_t anahtar,
 const void   *gösterici)
işlev
pthread_setspecific çağıran süreçteki anahtar ile ilişkili değeri verilen gösterici değeri ile değiştirir.
Eğer anahtar diye bir anahtar yoksa, EINVAL döndürür. Aksi takdirde 0 döndürür.
void *pthread_getspecific
(pthread_key_t anahtar)
işlev
pthread_getspecific çağıran süreçteki anahtar ile ilişkili geçerli değeri döndürür.
Eğer anahtar diye bir anahtar yoksa, EINVAL döndürür. Aksi takdirde 0 döndürür.
Aşağıdaki kod parçası 100 karakterlik bir evreye özgü dizi ayırır. Evre çıkışında da otomatik geri alır:
/* Evreye özgü tampon için anahtar */
static pthread_key_t buffer_key;

/* Anahtar bir kerelik hazırlanıyor */
static pthread_once_t buffer_key_once = PTHREAD_ONCE_INIT;

/* Evreye özgü tampon ayrılıyor */
void buffer_alloc(void)
{
  pthread_once(&buffer_key_once, buffer_key_alloc);
  pthread_setspecific(buffer_key, malloc(100));
}

/* Evreye özgü tampon döndürülüyor */
char * get_buffer(void)
{
  return (char *) pthread_getspecific(buffer_key);
}

/* Anahtarı ayır */
static void buffer_key_alloc()
{
  pthread_key_create(&buffer_key, buffer_destroy);
}

/* Evreye özgü tamponu serbest bırak */
static void buffer_destroy(void * buf)
{
  free(buf);
}
Önceki Üst Ana Başlık Sonraki
POSIX Semaforları Başlangıç Evreler ve Sinyal İşleme
Bir Linux Kitaplığı Sayfası