Thread Senkranizasyonu - Mutex

 Aynı anda birden fazla thread'in çalıştığı sistemlerde, thread'lerin birbirleriyle haberleÅŸmesi, senkron bir ÅŸekilde çalışması gerekebilir. Bu yazımızda C programlama dilinde thread'lerin mutex'ler ile nasıl senkronizasyonu yapılacağını inceleyeceÄŸiz.


Thread Senkronizasyonu Nedir

Thread senkronizasyonu, iki veya daha fazla eşzamanlı işlemin veya thread'in kritik bölümü olarak bilinen program segmentini aynı anda yürütmemesini sağlayan bir mekanizma olarak tanımlanır. Senkranizaasyon teknikleri kullanılarak süreçlerin kritik bölüme erişimi kontrol edilir. Bir thread'in kritik bölümü yürütülmeye başladığı anda, diğer thread ilk thread'in işi bitene kadar bekler. Uygun senkronizasyon teknikleri uygulanmaz ise, değişkenlerin değerlerinin tahmin edilemeyen ve proseslerin veya thread'lerin context switch ( bağlam anahtarı) zamanlamasına bağlı olarak değişebileceği bir yarış durumuna neden olabilir.


Mutex ile Senkronizasyon

Mutex ile paylaşılan bir kaynağı kilitler, sonrada serbest bırakırız. Kilitlenen kod bölgesi serbest bırakılana kadar baÅŸka hiçbir thread eriÅŸemez. 

pthread_mutex_t mutex; ile mutex adında bir nesne oluÅŸturulur. 

pthread_mutex_init(&mutex,0); ile  mutex oluÅŸturulur. BaÅŸarılı bir ÅŸekilde mutex oluÅŸturulursa 0 döndürür, baÅŸarılı bir ÅŸekilde mutex oluÅŸturulmaz ile -1 döndürür.

pthread_mutex_destroy(&mutex); ile tanımlayan mutex nesnesini siler. Mutex'ler paylaşılan kaynakları korumak için kullanılırlar. BaÅŸarılıysa 0, deÄŸilse -1 döner.

pthread_mutex_lock(&mutex); ile tanımlanan mutex nesnesini kilitler(lock). Mutex zaten baÅŸka bir thread tarafından kilitlenmiÅŸ ise, thread mutex'in kullanılabilir olmasını bekler. Bir mutex'i kilitleyen thread, mevcut sahibi olur ve aynı thread onu açana kadar sahibi olarak kalır. BaÅŸarılıysa 0, deÄŸilse -1 döner.

pthread_mutex_unlock(&mutex); ile mutex nesnesi serbest bırakılır. BaÅŸarılıysa 0, deÄŸilse -1 döner.

pthread_self(); ise bulunduÄŸu thread'in ID numarasını elde etmemizi saÄŸlar.


Şimdi bir örnek yapalım:




ÖrneÄŸimizde aynı yere ulaÅŸmaya çalışan 5 tane thread vardır. Bu 5 thread aynı hafıza bölgesine eriÅŸmeye çalışmaktadır. Aralarında bir yarış durumu olmaması için senkronizasyon yaptık. Önce pthread_mutex_t mutex; ile bir mutex nesnesi oluÅŸturduk. Daha sonra main() içerisinde pthread_mutex_init() ile mutex'imizi oluÅŸturduk. pthread_mutex_destroy() ile oluÅŸturduÄŸumuz mutex'i siliyoruz. Yani main() içerisinde mutex oluÅŸturuyoruz ve siliyoruz. void *thread() içinde pthread_mutex_lock() ile kilitlemek istediÄŸimiz kod bloÄŸunun üzerine yazdık. Buradan sonrası pthread_mutex_unlock() yazılana kadar kilitli olan blok olacaktır. pthread_mutex_unlock() ile kilitlenen kod bloÄŸunu serbest bırakılır.



Ekran Çıktısı:






Kaynaklar:

https://www.geeksforgeeks.org/mutex-lock-for-linux-thread-synchronization/
https://www.bogotobogo.com/cplusplus/multithreading_pthread.php