CodeBlanks Logo Icon CodeBlanks

Data race

Data race ve nasıl önleneceğini öğrenirsin.

Data race

Bir data race (veri yarışı), iki iş parçacığının aynı belleğe aynı anda erişip en az birinin yazma yapması ve aralarında eşzamanlama olmaması durumudur. C++ standardına göre bu tanımsız davranış (undefined behavior) üretir.

Örnek: int counter = 0; üzerinde iki iş parçacığı counter++ yaparsa, bazı artımlar kaybolabilir; sonuç 2 yerine 1 çıkabilir. Çözüm: değişkeni std::atomic<int> yap veya std::mutex ile koru.

Atomiği yarışı önler

std::atomic bir değişken üzerinde her erişim bölünmez olduğu için data race oluşmaz. Aynı counter.fetch_add(1, std::memory_order_relaxed) çağrısı iki iş parçacığında bile her artım eksiksiz yapılır; sonuç tutarlıdır.

Relaxed sırası yalnızca atomikliği sağlar, iş parçacıkları arası sıra vermez. Yarışı önlemek için yeter; ama başka değişkenlerin sırasını garanti etmez. Sıra gerekirse acquire-release veya seq_cst kullanılır.

Uygulama Atomik fetch_add ile yarışı önle

Global std::atomic<int> counter{0}; tanımla. main içinde counter.fetch_add(1, std::memory_order_relaxed); çağrısını iki kez yap ve std::cout << counter.load(); yaz.

Başlangıç kodu

main.cpp
#include <iostream>
#include <atomic>

// counter atomiğini buraya tanımla

int main() {
    // counter'ı iki kez atomik artır ve yazdır
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>
#include <atomic>

std::atomic<int> counter{0};

int main() {
    counter.fetch_add(1, std::memory_order_relaxed);
    counter.fetch_add(1, std::memory_order_relaxed);
    std::cout << counter.load();
    return 0;
}

Beklenen çıktı

2

Soru ve cevaplar

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

1 Hangi durumda data race oluşur?

main.cpp
int counter = 0;
// thread 1: counter++
// thread 2: counter++
  • İki iş parçacığı farklı değişkene erişir
  • İki iş parçacığı aynı atomik değişkene erişir
  • İki iş parçacığı aynı mutex ile kilitleme yapar
  • İki iş parçacığı aynı değişkene erişir, en az biri yazar, eşzamanlama yok Doğru cevap

Açıklama: Paylaşılan bellek, yazma ve eşzamanlama eksikliği üçlüsü data race'tir.

2 Mutex kilidini tamamla

Soru
std::lock_guard<std::mutex> lk(____);
Cevap
std::lock_guard<std::mutex> lk(mtx);

Açıklama: mtx mutex'ini lock_guard ile kilitlersin.

3 Aracı rolüne eşle

Kavram Anlamı
data race Tanımsız davranış
std::atomic<int> Atomik erişim, yarış yok
std::mutex Kilitleme ile korur
fetch_add Bölünmez artırma

Uzman bölümündeki tüm dersler