pthread_cond
- C kursu
- İleri seviye
- Ders 22/83
- 5 dk
pthread_cond ile koşul değişkeni öğrenirsin.
pthread_cond
Koşul değişkeni, bir iş parçacığının başka bir iş parçacığını sinyal ile uyandırmasını sağlar. Ortak bir durum değiştiğinde haber verir.
Önce pthread_cond_t cond; tanımla ve pthread_cond_init(&cond, NULL) ile başlat. Bekleyen taraf pthread_cond_wait(&cond, &lock) ile uyur; bu sırada kilidi bırakır. Sinyal veren taraf pthread_cond_signal(&cond) ile uyandırır. Bekleyen taraf uyanınca kilidi yeniden alır.
Üretici-tüketici
Koşul değişkeninin klasik örneği üretici-tüketici desenidir. Üretici veri koyar ve sinyal verir; tüketici veri varsa alır, yoksa bekler.
Tüketici while (!ready) pthread_cond_wait(&cond, &lock); ile döngüde bekler. while kullanmak önemlidir; çünkü cond_wait yalancı uyanma dönebilir. Üretici ready = 1; pthread_cond_signal(&cond); ile haberi verir. Mutex, paylaşılan ready değişkenini korur.
Uygulama Üretici-tüketici
int ready = 0;, pthread_mutex_t lock; ve pthread_cond_t cond; tanımla. void *producer(void *arg): pthread_mutex_lock(&lock); ready = 1; pthread_cond_signal(&cond); pthread_mutex_unlock(&lock);. void *consumer(void *arg): pthread_mutex_lock(&lock); while (!ready) pthread_cond_wait(&cond, &lock); pthread_mutex_unlock(&lock);. İkisini oluştur, join et ve printf("hazır=%d\n", ready);.
Başlangıç kodu
#include <stdio.h>
#include <pthread.h>
int ready = 0;
pthread_mutex_t lock;
pthread_cond_t cond;
// producer ve consumer yaz
// cond_wait ile bekle, cond_signal ile haber ver
// ready'yi yazdır
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
#include <pthread.h>
int ready = 0;
pthread_mutex_t lock;
pthread_cond_t cond;
void *producer(void *arg) {
pthread_mutex_lock(&lock);
ready = 1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&lock);
return NULL;
}
void *consumer(void *arg) {
pthread_mutex_lock(&lock);
while (!ready) {
pthread_cond_wait(&cond, &lock);
}
pthread_mutex_unlock(&lock);
return NULL;
}
int main(void) {
pthread_mutex_init(&lock, NULL);
pthread_cond_init(&cond, NULL);
pthread_t tp, tc;
pthread_create(&tc, NULL, consumer, NULL);
pthread_create(&tp, NULL, producer, NULL);
pthread_join(tp, NULL);
pthread_join(tc, NULL);
printf("hazır=%d\n", ready);
return 0;
}Beklenen çıktı
hazır=1
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 pthread_cond_wait çağrıldığında ne olur?
- Sinyal gönderir
- Uyur ve kilidi bırakır Doğru cevap
- Kilit alır
- İş parçacığı sonlanır
Açıklama: cond_wait uyur ve uyurken kilidi bırakır.
2 Cond fonksiyonlarını eşle
| Kavram | Anlamı |
|---|---|
pthread_cond_wait |
Uyur ve bekler |
pthread_cond_signal |
Birini uyandırır |
pthread_cond_init |
Koşulu başlatır |
spurious wakeup |
Yalancı uyanma |
3 cond_wait çağrısı
pthread_cond_____(&cond, &lock);
pthread_cond_wait(&cond, &lock);
Açıklama: pthread_cond_wait kilidi bırakıp uyur.