CodeBlanks Logo Icon CodeBlanks

İş parçacığı güvenliği

  • C kursu
  • İleri seviye
  • Ders 23/83
  • 5 dk

İş parçacığı güvenliği ve data race kavramlarını öğrenirsin.

İş parçacığı güvenliği

İş parçacığı güvenliği, bir kodun birden çok iş parçacığı tarafından aynı anda çağrıldığında doğru çalışmasıdır. Paylaşılan veriye korumasız erişim veri yarışına yol açar.

Veri yarışı, iki iş parçacığı aynı değişkene erişip en az biri yazıyorsa oluşur. Sonuç tahmin edilemez: counter++ 2000 kez çağrılsa bile sayı 2000 çıkmayabilir. Mutex ile erişimi sıraya koyarsın ve yarışı önlersin.

Veri yarışı

Veri yarışı, eşzamanlı erişimin sonucunun belirsiz olmasıdır. İki iş parçacığı counter++ yaparsa, bazı artırmalar kaybolabilir.

Örneğin iki iş parçacığı 1000'er kez artırsa, counter 2000 yerine 1732 çıkabilir. Mutex eklersen her artırma atomik olur ve sonuç her zaman 2000'dir. Derleyici uyarıları ve araçlar yarışı tespit edebilir; ama en güvenli yol mutex kullanmaktır.

Uygulama Yarışsız sayaç

void *worker(void *arg) yaz; içinde for (int i = 0; i < 100; i++) { pthread_mutex_lock(&lock); counter++; pthread_mutex_unlock(&lock); }. İki iş parçacığı oluştur, join et ve printf("sayaç=%d\n", counter);. Mutex sayesinde sonuç 200 olur.

Başlangıç kodu

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

int counter = 0;
pthread_mutex_t lock;

// worker'a for döngüsü ekle (100 kez mutex ile artır)
// iki iş parçacığı oluştur ve bekle
// counter'ı yazdır

int main(void) {
    return 0;
}

Örnek çözüm

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

int counter = 0;
pthread_mutex_t lock;

void *worker(void *arg) {
    for (int i = 0; i < 100; i++) {
        pthread_mutex_lock(&lock);
        counter++;
        pthread_mutex_unlock(&lock);
    }
    return NULL;
}

int main(void) {
    pthread_mutex_init(&lock, NULL);
    pthread_t t1, t2;
    pthread_create(&t1, NULL, worker, NULL);
    pthread_create(&t2, NULL, worker, NULL);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    printf("sayaç=%d\n", counter);
    return 0;
}

Beklenen çıktı

sayaç=200

Soru ve cevaplar

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

1 Güvenlik kavramlarını eşle

Kavram Anlamı
mutex Yarışı önler
data race Belirsiz erişim
lock Kilit alır
counter++ Artırma işlemi

2 Veri yarışı nasıl önlenir?

  • fork ile
  • printf ile
  • Mutex ile Doğru cevap
  • exit ile

Açıklama: Mutex, paylaşılan erişimi sıraya koyar.

3 Kritik bölge

Soru
pthread_mutex_lock(&____);
counter++;
pthread_mutex_unlock(&lock);
Cevap
pthread_mutex_lock(&lock);
counter++;
pthread_mutex_unlock(&lock);

Açıklama: lock ile kritik bölge başlar.

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