memory_order
- C++ kursu
- İleri seviye
- Ders 26/83
- 5 dk
memory_order ile bellek sıralamasını öğrenirsin.
memory_order
memory_order, atomic işlemin diğer işlemlerle görünürlük ve sıralama garantilerini belirler. Varsayılan std::memory_order_seq_cst en güçlü garantidir; tüm iş parçacıkları aynı sırayı görür. Daha zayıf sıralamalar performans kazandırır ama dikkat ister.
std::memory_order_relaxed yalnızca atomikliği garanti eder; sıralama yoktur. std::memory_order_acquire okuma sırasında önceki yazıları görür; std::memory_order_release yazma sırasındaki değişiklikleri yayımlar. Bu ikisi, üretici-tüketici senkronizasyonu oluşturur. Yeni başlayanlar seq_cst kullanmalıdır.
acquire ve release
Bir iş parçacığı store(v, std::memory_order_release) yaparsa, başka bir iş parçacığı load(std::memory_order_acquire) ile okuduğunda, yayınlayan tarafın release öncesi tüm değişikliklerini görür. Bu, üretici-tüketici senkronizasyonu kurar.
Örnek: üretici veriyi hazırlar, ready.store(true, release) yapar. Tüketici ready.load(acquire) ile true görünce verinin hazır olduğunu bilir. Bu çift, kilitsiz senkronizasyonun temelidir. Yanlış sıralama, veri yarışına yol açabilir; bu yüzden dikkatli kullanılır.
Uygulama relaxed ile store/load
std::atomic<int> a{0}; oluştur. a.store(1, std::memory_order_relaxed); ile yaz, std::cout << a.load(std::memory_order_relaxed); ile oku ve yazdır. <atomic> başlığını ekle.
Başlangıç kodu
#include <iostream>
#include <atomic>
int main() {
// atomic oluştur, relaxed ile store/load
return 0;
}Örnek çözüm
#include <iostream>
#include <atomic>
int main() {
std::atomic<int> a{0};
a.store(1, std::memory_order_relaxed);
std::cout << a.load(std::memory_order_relaxed);
return 0;
}Beklenen çıktı
1
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 memory_order sabitini tamamla
std::atomic<int> a{0};
a.store(1, std::____);
std::atomic<int> a{0};
a.store(1, std::memory_order_relaxed);
Açıklama: memory_order_relaxed yalnızca atomikliği garanti eder.
2 memory_order_relaxed ne garanti etmez?
- Atomikliği
- İşlem sıralamasını Doğru cevap
- Tür güvenliğini
- Bellek boyutunu
Açıklama: relaxed yalnızca atomikliği garanti eder; sıralama yoktur.
3 Sıralamayı amacına eşle
| Kavram | Anlamı |
|---|---|
memory_order_relaxed |
Yalnızca atomiklik |
memory_order_acquire |
Okuma yanında görme |
memory_order_release |
Yazma yanında yayımlama |
memory_order_seq_cst |
En güçlü garanti |