C
pthread_cond
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);.
Örnek çözümü göster
#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;
}
Kendini test et
-
pthread_cond_wait çağrıldığında ne olur?
- Sinyal gönderir
- Uyur ve kilidi bırakır
- Kilit alır
- İş parçacığı sonlanır
Cevabı göster
Uyur ve kilidi bırakır — cond_wait uyur ve uyurken kilidi bırakır.
-
Cond fonksiyonlarını eşle
- 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
-
cond_wait çağrısı
pthread_cond_____(&cond, &lock);
Cevabı göster
pthread_cond_wait(&cond, &lock);
Sıradaki ders: İş parçacığı güvenliği