Acquire-release
- C++ kursu
- Uzman
- Ders 17/47
- 5 dk
acquire-release semantiğini öğrenirsin.
Acquire-release
Acquire-release modeli, seq_cst'den daha ucuz bir eşzamanlama sağlar. Yalnızca eşleştirilmiş release store ve acquire load arasında sıra verir; total sıra garanti etmez.
Bir iş parçacığı flag.store(true, std::memory_order_release) yapar; diğeri flag.load(std::memory_order_acquire) ile true gördüğünde, ilk iş parçacığının release öncesi tüm yazmaları görünür olur. Bu, yaygın publish-then-observe desenidir.
Publish-then-observe
Acquire-release modelinin yaygın kullanımı publish-then-observe desenidir. A iş parçacığı payload'ı hazırlar, sonra flag'i release ile yayınlar. B iş parçacığı flag'i acquire ile okur; true gördüğünde payload hazır demektir.
seq_cst'den farkı: yalnızca bu eşleşen ikili arasında sıra vardır; diğer iş parçacıkları farklı sıra görebilir. Ama çoğu durumda bu yeter; performans daha iyi olur.
Uygulama Acquire-release ile publish-observe yaz
Global std::atomic<bool> flag{false}; ve int payload = 0; tanımla. main içinde payload = 99;, ardından flag.store(true, std::memory_order_release);, sonra bool v = flag.load(std::memory_order_acquire); ve std::cout << v; yaz.
Başlangıç kodu
#include <iostream>
#include <atomic>
// flag ve payload değişkenlerini buraya tanımla
int main() {
// payload'u ayarla, flag'i yayınla, yükle ve yazdır
return 0;
}Örnek çözüm
#include <iostream>
#include <atomic>
std::atomic<bool> flag{false};
int payload = 0;
int main() {
payload = 99;
flag.store(true, std::memory_order_release);
bool v = flag.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 store'u tamamla
flag.store(true, std::memory_order_____);
flag.store(true, std::memory_order_release);
Açıklama: release, yazma tarafını işaretler.
2 Sıralamayı rolüne eşle
| Kavram | Anlamı |
|---|---|
store + release |
Yazma yayınlar |
load + acquire |
Okuma yayınları görür |
relaxed |
Sıra garantisi yok |
seq_cst |
Total sıra garantisi |
3 Acquire-release modeli hangi garantiyi sağlar?
flag.store(true, release);
bool v = flag.load(acquire);- Eşleştirilmiş yazma-okuma arasında sıra Doğru cevap
- Total sıra tüm iş parçacıklarında
- Hiçbir sıra garantisi
- Yalnızca tek iş parçacığı sırası
Açıklama: Acquire-release yalnızca eşleştirilmiş release-acquire arasında sıra verir.