İş 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
#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
#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
pthread_mutex_lock(&____);
counter++;
pthread_mutex_unlock(&lock);
pthread_mutex_lock(&lock);
counter++;
pthread_mutex_unlock(&lock);
Açıklama: lock ile kritik bölge başlar.