CodeBlanks Logo Icon CodeBlanks

Acquire-release

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

main.cpp
#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

main.cpp
#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

Soru
flag.store(true, std::memory_order_____);
Cevap
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?

main.cpp
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.

Uzman bölümündeki tüm dersler