CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

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

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

Soru
std::atomic<int> ready{0};
ready.store(1, std::memory_order_____);
Cevap
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?

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

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