pthread_mutex
- C kursu
- İleri seviye
- Ders 21/83
- 5 dk
pthread_mutex ile karşılıklı dışlama öğrenirsin.
pthread_mutex
Mutex (mutual exclusion), paylaşılan veriye erişimi sıraya koyan bir kilittir. Aynı anda yalnızca bir iş parçacığı kilitli bölgeye girer.
Önce pthread_mutex_t lock; tanımla ve pthread_mutex_init(&lock, NULL) ile başlat. Kritik bölge öncesi pthread_mutex_lock(&lock), sonrası pthread_mutex_unlock(&lock). Aradaki kod yalnızca bir iş parçacığı tarafından çalıştırılır. İş bitince pthread_mutex_destroy(&lock) ile temizle.
Kritik bölge
Kritik bölge, paylaşılan veriye erişen kod parçasıdır. Birden çok iş parçacığı aynı anda buraya girerse veri yarışı (data race) oluşur; sonuç tahmin edilemez.
Örneğin counter++ aslında oku-artır-yaz adımlarından oluşur. İki iş parçacığı arka arkaya girerse biri ezilebilir. Mutex ile bölgeyi kilitlersin: lock, counter artır, unlock. Böylece her artırma tam ve sıralı olur.
Uygulama İki iş parçacığı ile sayaç
int counter = 0; ve pthread_mutex_t lock; global tanımla. void *worker(void *arg) yaz; içinde pthread_mutex_lock(&lock); counter++; pthread_mutex_unlock(&lock);. pthread_mutex_init(&lock, NULL); ile başlat. İki iş parçacığı oluştur, join et ve printf("sayaç=%d\n", counter);.
Başlangıç kodu
#include <stdio.h>
#include <pthread.h>
int counter = 0;
pthread_mutex_t lock;
// worker işlevini yaz (mutex ile koru)
// iki iş parçacığı oluştur ve bekle
// counter'ı yazdır
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
#include <pthread.h>
int counter = 0;
pthread_mutex_t lock;
void *worker(void *arg) {
pthread_mutex_lock(&lock);
counter++;
pthread_mutex_unlock(&lock);
return NULL;
}
int main(void) {
pthread_mutex_init(&lock, NULL);
pthread_t t1, t2;
pthread_create(&t1, NULL, worker, NULL);
pthread_create(&t2, NULL, worker, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
printf("sayaç=%d\n", counter);
return 0;
}Beklenen çıktı
sayaç=2
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Mutex kilidi
pthread_mutex_____(&lock);
pthread_mutex_lock(&lock);
Açıklama: pthread_mutex_lock kilidi alır.
2 Mutex fonksiyonlarını eşle
| Kavram | Anlamı |
|---|---|
pthread_mutex_lock |
Kilidi alır |
pthread_mutex_unlock |
Kilidi bırakır |
pthread_mutex_init |
Kilidi başlatır |
critical section |
Kritik bölge |
3 Mutex ne için kullanılır?
- Kritik bölgeyi korumak Doğru cevap
- İş parçacığı oluşturmak
- Sinyal göndermek
- Bellek ayırmak
Açıklama: Mutex, kritik bölgeyi korur ve veri yarışını önler.