C++
Happens-before
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.
Örnek çözümü göster
#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;
}
Kendini test et
-
Release sırasını tamamla
std::atomic<int> ready{0};
ready.store(1, std::memory_order_____);
Cevabı göster
std::atomic<int> ready{0};
ready.store(1, std::memory_order_release);
-
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
Cevabı göster
A release, B acquire yapar ve B release'i görürse — Release-acquire eşleşmesi happens-before ilişkisini kurar.
-
Kavramı rolüne eşle
- 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
Sıradaki ders: Sequential consistency