CodeBlanks Logo Icon CodeBlanks

Compare-exchange

compare_exchange ile atomik karşılaştırma-değiştirme öğrenirsin.

Compare-exchange

compare_exchange_strong, atomik bir karşılaştırma ve değiştirmedir (CAS — Compare And Swap). Beklenen değer expected ile atomic değer eşitse, atomic değeri desired yapar ve true döndürür. Eşit değilse expected'ı atomic değeri yapar ve false döndürür.

Sözdizimi: a.compare_exchange_strong(expected, desired). Bu işlem bölünmezdir; başka bir iş parçacığı araya giremez. CAS, kilitsiz veri yapılarının (lock-free stack, queue) temel taşıdır. compare_exchange_weak ise bazen sahte başarısızlığa uğrayabilir; döngü içinde kullanılır.

CAS döngüsü

CAS çoğu zaman bir döngü içinde kullanılır. Eğer compare_exchange_strong false dönerse, expected artık güncel atomic değerini taşır; kullanıcı yeni bir desired hesaplar ve yeniden dener. Bu, iyimser (optimistic) güncelleme kalıbıdır.

Örnek: kilitsiz bir sayaç artırmak için do { expected = a.load(); desired = expected + 1; } while (!a.compare_exchange_strong(expected, desired)); yazılır. Eğer başka bir iş parçacığı araya girdiyse döngü tekrar eder; aksi halde tek seferde biter. Bu, mutex'siz senkronizasyonun temelidir.

Uygulama CAS ile 5 -> 10

std::atomic<int> a{5}; oluştur. int expected = 5; tanımla. bool ok = a.compare_exchange_strong(expected, 10); ile takas dene. std::cout << ok << " " << a.load(); yaz.

Başlangıç kodu

main.cpp
#include <iostream>
#include <atomic>

int main() {
    // atomic oluştur, CAS yap, sonucu yazdır
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>
#include <atomic>

int main() {
    std::atomic<int> a{5};
    int expected = 5;
    bool ok = a.compare_exchange_strong(expected, 10);
    std::cout << ok << " " << a.load();
    return 0;
}

Beklenen çıktı

1 10

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 compare_exchange_strong ne döndürür?

main.cpp
bool ok = a.compare_exchange_strong(expected, desired);
  • Yeni değeri
  • Eski değeri
  • Başarı bool'unu Doğru cevap
  • Atomic türünü

Açıklama: compare_exchange_strong bool döndürür; true takas yapıldığını gösterir.

2 Parçayı rolüne eşle

Kavram Anlamı
expected Beklenen değer
desired Yeni değer
a.compare_exchange_strong CAS işlemi
bool ok = ... Sonuç (başarı)

3 compare_exchange satırını tamamla

Soru
std::atomic<int> a{5};
int expected = 5;
bool ok = a.____(expected, 10);
Cevap
std::atomic<int> a{5};
int expected = 5;
bool ok = a.compare_exchange_strong(expected, 10);

Açıklama: compare_exchange_strong(expected, 10) takas yapar.

İleri seviye bölümündeki tüm dersler