Data race
- C++ kursu
- Uzman
- Ders 16/47
- 5 dk
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
#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
#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?
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
std::lock_guard<std::mutex> lk(____);
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 |