Özet - Bellek modeli
- C++ kursu
- Uzman
- Ders 18/47
- 5 dk
memory model, happens-before ve acquire-release'i birleştirerek bir sync primitive yazarsın.
Özet - Bellek modeli
Bu grupta bellek modelinin temel araçlarını gördün: std::atomic, happens-before, sequential consistency, data race ve acquire-release. Hepsi çok iş parçacıklı programların doğruluğunu sağlar.
Şimdi bunları bir atomik sayaç örneğinde birleştireceksin. store, fetch_add ve load işlemleri tek bir programda yer alacak; böylece atomik erişimin nasıl birleştiğini göreceksin.
Atomik sayaç
Bir std::atomic<int> sayaç, store ile başlangıç değeri alır, fetch_add ile bölünmez artırılır ve load ile okunur. Tüm işlemler atomik olduğu için data race oluşmaz.
Örnek: counter.store(5); counter.fetch_add(3); std::cout << counter.load();. Sonuç 8 olur. Bu örnekte fetch_add varsayılan seq_cst sırasını kullanır; tek iş parçacıklı olsa bile davranış belirlidir.
Uygulama Atomik sayacı birleştir
Global std::atomic<int> counter{0}; tanımla. main içinde counter.store(5);, counter.fetch_add(3); ve std::cout << counter.load(); yaz.
Başlangıç kodu
#include <iostream>
#include <atomic>
// counter atomiğini buraya tanımla
int main() {
// counter'ı başlat, artır ve yazdır
return 0;
}Örnek çözüm
#include <iostream>
#include <atomic>
std::atomic<int> counter{0};
int main() {
counter.store(5);
counter.fetch_add(3);
std::cout << counter.load();
return 0;
}Beklenen çıktı
8
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 std::atomic işlemlerinin varsayılan bellek sırası nedir?
x.store(5); // varsayılan- memory_order_relaxed
- memory_order_seq_cst Doğru cevap
- memory_order_release
- memory_order_acquire
Açıklama: seq_cst varsayılan sıradır; en güçlü garantiyi verir.
2 fetch_add sırasını tamamla
counter.fetch_add(1, std::memory_order_____);
counter.fetch_add(1, std::memory_order_relaxed);
Açıklama: relaxed yalnızca atomiklik sağlar; sıra gerekmezse yeter.
3 Aracı özelliğine eşle
| Kavram | Anlamı |
|---|---|
std::atomic |
Bölünmez erişim |
happens-before |
İş parçacıkları arası sıra |
seq_cst |
Total sıra, varsayılan |
acquire-release |
Eşleştirilmiş sıra |