mutex in c etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
mutex in c etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
 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