CodeBlanks Logo Icon CodeBlanks

Süreç ve thread

  • C kursu
  • İleri seviye
  • Ders 80/83
  • 6 dk

fork ve pthread ile paralel işleme yazarsın.

Süreç ve thread

Bu derste worker_init işlevini tanımlayacaksın. pthread ile bir iş parçacığı başlatır, pthread_join ile beklersin. İş parçacığı worker_count değişkenini mutex koruması altında artırır.

Bu, projenin paralellik katmanıdır. pthread_create(&t, NULL, worker_fn, NULL) ile iş parçacığı oluşturulur; pthread_join(t, NULL) ile bitmesi beklenir. worker_fn içinde mutex kilitlenir, sayaç artırılır, mutex açılır. Bu desen, ileride gerçek bir sunucunun her istemciye bir iş parçacığı açmasının temelidir.

worker_init gövdesi

İşçi işlevi void *worker_fn(void *arg): mutex'i kilitler, worker_count++ yapar, mutex'i açar. (void)arg; ile kullanılmayan parametre uyarısını bastırırız.

int worker_init(void): pthread_t t; tanımla, pthread_create(&t, NULL, worker_fn, NULL) ile thread başlat, pthread_join(t, NULL) ile bekle, return 1;. Main'de worker_init(); çağır ve printf("sayaç: %d\n", worker_count);. Çıktı: "Proje hazır" sonra "sayaç: 1". Önceki dersin main'i bu dersin başlangıç koduna dahil edilir.

Uygulama worker_init'i ekle

void *worker_fn(void *arg) yaz: (void)arg;, pthread_mutex_lock(&worker_lock);, worker_count++;, pthread_mutex_unlock(&worker_lock);, return NULL;. int worker_init(void) yaz: pthread_t t;, pthread_create(&t, NULL, worker_fn, NULL);, pthread_join(t, NULL);, return 1;. main'e worker_init(); ve printf("sayaç: %d\n", worker_count); ekle.

Başlangıç kodu

main.c
#include <stdio.h>
#include <pthread.h>

int worker_init(void);
int server_setup(void);
int ipc_setup(void);

int worker_count = 0;
pthread_mutex_t worker_lock = PTHREAD_MUTEX_INITIALIZER;

// worker_init fonksiyonunu yaz: pthread_create ile işçi başlat, join ile bekle
// işçi worker_count'ı 1 yapar (mutex ile)

int main(void) {
    printf("Proje hazır\n");
    // worker_init çağır ve sayaç yazdır
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>
#include <pthread.h>

int worker_init(void);
int server_setup(void);
int ipc_setup(void);

int worker_count = 0;
pthread_mutex_t worker_lock = PTHREAD_MUTEX_INITIALIZER;

void *worker_fn(void *arg) {
    (void)arg;
    pthread_mutex_lock(&worker_lock);
    worker_count++;
    pthread_mutex_unlock(&worker_lock);
    return NULL;
}

int worker_init(void) {
    pthread_t t;
    pthread_create(&t, NULL, worker_fn, NULL);
    pthread_join(t, NULL);
    return 1;
}

int main(void) {
    printf("Proje hazır\n");
    worker_init();
    printf("sayaç: %d\n", worker_count);
    return 0;
}

Beklenen çıktı

Proje hazır
sayaç: 1

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 pthread kavramlarını eşle

Kavram Anlamı
pthread_create Thread başlatır
pthread_join Thread bekler
pthread_mutex_lock Kilit alır
worker_count Sayaç

2 pthread_join ne yapar?

  • Thread oluşturur
  • Thread öldürür
  • Thread askıya alır
  • Thread bekler Doğru cevap

Açıklama: pthread_join thread bitene kadar bekler.

3 pthread_create çağrısı

Soru
pthread_create(&t, NULL, worker_fn, ____);
Cevap
pthread_create(&t, NULL, worker_fn, NULL);

Açıklama: Dördüncü parametre NULL; argüman yok.

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