Happens-before
- C++ kursu
- Uzman
- Ders 14/47
- 5 dk
happens-before ilişkisini öğrenirsin.
Happens-before
Happens-before ilişkisi, bir iş parçacığındaki işlemin sonucunun başka bir iş parçacığında görülebildiğini söyleyen sıralama bağıdır. Eğer A happens-before B ise, B her zaman A'nın etkisini görür.
İş parçacıkları arasında happens-before kurmanın yaygın yolu release-acquire çiftidir: A iş parçacığı flag.store(1, std::memory_order_release) yapar; B iş parçacığı flag.load(std::memory_order_acquire) ile okur. B, 1 değerini gördüğünde A'nın yayın öncesi tüm yazmaları görünür hale gelir.
Sıralama kurma
Happens-before ilişkisi kurulmadan iki iş parçacığı arası sıra yoktur: bir yazar, diğeri okur ama okuyucu eski değeri sonsuza dek görebilir. std::memory_order_relaxed sadece atomiklik sağlar, sıra vermez.
Release-acquire ise sıra verir. A, data = 42; yazar sonra ready.store(1, release) yapar. B, ready.load(acquire) ile 1 gördüğünde data'nın 42 olduğunu garantilemiş olur. Bu, publish-then-observe desenidir.
Uygulama Release-acquire ile happens-before kur
Global std::atomic<int> ready{0}; ve int data = 0; tanımla. main içinde data = 42;, ardından ready.store(1, std::memory_order_release); sonra int v = ready.load(std::memory_order_acquire); ve std::cout << v; yaz.
Başlangıç kodu
#include <iostream>
#include <atomic>
// ready atomiğini ve data değişkenini buraya tanımla
int main() {
// data'yı ayarla, ready'yi yayınla, yükle ve yazdır
return 0;
}Örnek çözüm
#include <iostream>
#include <atomic>
std::atomic<int> ready{0};
int data = 0;
int main() {
data = 42;
ready.store(1, std::memory_order_release);
int v = ready.load(std::memory_order_acquire);
std::cout << v;
return 0;
}Beklenen çıktı
1
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Release sırasını tamamla
std::atomic<int> ready{0};
ready.store(1, std::memory_order_____);
std::atomic<int> ready{0};
ready.store(1, std::memory_order_release);
Açıklama: release, yayınlama tarafını belirtir.
2 Hangi koşulda A'nın yazması B'nin okumasından önce happens-before olur?
Thread A: data = 42; ready.store(1, release);
Thread B: if (ready.load(acquire)) use(data);- Her zaman
- Yalnızca A başlamadan B biterse
- İkisi aynı CPU çekirdeğindeyse
- A release, B acquire yapar ve B release'i görürse Doğru cevap
Açıklama: Release-acquire eşleşmesi happens-before ilişkisini kurar.
3 Kavramı rolüne eşle
| Kavram | Anlamı |
|---|---|
sequenced-before |
Tek iş parçacığı sırası |
happens-before |
İş parçacıkları arası sıra |
release store |
Yazma yayınlar |
acquire load |
Okuma yayınları görür |