Compare-exchange
- C++ kursu
- İleri seviye
- Ders 27/83
- 5 dk
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
#include <iostream>
#include <atomic>
int main() {
// atomic oluştur, CAS yap, sonucu yazdır
return 0;
}Örnek çözüm
#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?
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
std::atomic<int> a{5};
int expected = 5;
bool ok = a.____(expected, 10);
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.