26 Aralık 2016 Pazartesi

Posix Eşzamanlılık Yapıları - Read Write Lock

Giriş
Şu satırı dahil ederiz.
#include <pthread.h>
Read Write kilitleri için iki tane farklı çözüm var. İlk çözümde Reader'lar  en az bekleyeme uğrarken, ikinci çözümde Writer'lar en az beklemeye uğruyor. Yani hangisinin öncelikli olduğu çözüme göre değişebiliyor.

Bir Read Write kilidi için 2 semaphore, 3 mutex ve iki integer değişken lazımmış.

PTHREAD_RWLOCK_INITIALIZER Macrosu
Şöyle yaparız.
pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
pthread_rwlock_init metodu
Şöyle yaparız.
pthread_rwlockattr_t attr;
pthread_rwlockattr_init(&attr);
pthread_rwlockattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);

pthread_rwlock_init(&rwlock, &attr);
pthread_rwlock_rdlock metodu
Okuma kilidi alır. Şöyle yaparız.
pthread_rwlock_rdlock(&rw_lock);
Hata kontrolü yapmak istersek şöyle yaparız.
if (pthread_rwlock_rdlock(&rw_lock) != 0) {
  perror("reader_thread: pthread_rwlock_rdlock error");
  exit(__LINE__);
}
pthread_rwlock_tryrdlock metodu
Örnek ver

pthread_rwlock_wrlock metodu
Write lock alır. Şöyle yaparız.
pthread_rwlock_wrlock(&rw_lock); 
Hata kontrolü yapmak istersek şöyle yaparız.
if (pthread_rwlock_wrlock(&rw_lock) != 0) {
  perror("writer thread: pthread_rwlock_wrlock error");
  exit(__LINE__);
}
pthread_rwlock_trywrlock metodu
Örnek ver

pthread_rwlock_unlock metodu
Read veya Write lock'i bırakır. Şöyle yaparız.
pthread_rwlock_unlock(&rw_lock);
Hata kontrolü yapmak istersek şöyle yaparız.
if (pthread_rwlock_unlock(&rw_lock) != 0) {
  perror("reader thread: pthred_rwlock_unlock error");
  exit(__LINE__);
}

Hiç yorum yok:

Yorum Gönder