CodeBlanks Logo Icon CodeBlanks

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

main.c
#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

main.c
#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ı

Soru
pthread_cond_____(&cond, &lock);
Cevap
pthread_cond_wait(&cond, &lock);

Açıklama: pthread_cond_wait kilidi bırakıp uyur.

İleri seviye bölümündeki tüm dersler