17 Mart 2017 Cuma

Posix Eşzamanlılık Yapıları - Mutex

Giriş
Şu satırı dahil ederiz.
#include<pthread.h>
pthread_mutex_t Yapısı
Yapı şuna benzer.
/* User visible part of a mutex.  */
struct __pthread_mutex
{
  __pthread_spinlock_t __held;
  __pthread_spinlock_t __lock;
  char *cthreadscompat1;
  struct __pthread *__queue;
  struct __pthread_mutexattr *attr;
  void *data;
  void *owner;
  unsigned locks;
};
Dolayısıyla ilklendirmesinin kolay olmadığı anlaşılabilir.

pthread_mutexattr_init metodu
Mutex'e verilecek özellikleri varsayılan değerler ile ilklendirmek için şöyle yaparız.
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_setpshared metodu
Mutex'e verilecek özellikleri atamak için şöyle yaparız.
pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
pthread_mutex_destroy metodu
Şöyle yaparız.
pthread_mutex_destroy (&mutex);
pthread_mutex_init metodu
Açıklaması şöyle
Attempting to initialise an already initialised mutex results in undefined behaviour.
Mutex'i kullanmaya başlamadan önce pthread_mutex_init() metodu ile ilklendirmek gerekiyor.
Metodun imzası şöyle.
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
                       const pthread_mutexattr_t *restrict attr);
Şöyle kullanırız.
pthread_mutex_t mutex;
pthread_mutex_init (&mutex, NULL);
Eğer ikinci parametreye NULL geçersek, POSIX kütüphanesinin gerçekleştirmesine bağımlı olan bir default davranış elde ederiz. Default davranış ta non-recursive mutex'tir. Ancak bu davranış platforma göre değişebiliyor denmiş fakat ben bunu gözlemleyemedim . O yüzden emin olmak adına NULL kullanmamak daha iyi.

PTHREAD_MUTEX_INITIALIZER
Açıklaması şöyle
...
In cases where default mutex attributes are appropriate, the macro PTHREAD_MUTEX_INITIALIZER can be used to initialize mutexes. The effect shall be equivalent to dynamic initialization by a call to pthread_mutex_init() with parameter attr specified as NULL. ...
Eğer mutex static veya global ise kullanırız.

Örnek 1 - static global mutex
Şöyle yaparız.
static pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
Örnek 2 - static member mutex
Elimizde şöyle bir sınıf olsun.
class Mutex{
public:
    static pthread_mutex_t mutex;
public:
    Mutex();
    virtual ~Mutex();
};
Şöyle yaparız.
pthread_mutex_t Mutex::mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock metodu
Şöyle yaparız.
pthread_mutex_lock (&mutex);
pthread_mutex_trylock metodu
İmzası şöyle
int pthread_mutex_trylock (pthread_mutex_t *mutex);
pthread_mutex_unlock metodu
pthread_mutex_unlock yazısına taşıdım.




Hiç yorum yok:

Yorum Gönder