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
#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
#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ı
pthread_create(&t, NULL, worker_fn, ____);
pthread_create(&t, NULL, worker_fn, NULL);
Açıklama: Dördüncü parametre NULL; argüman yok.