Karşılaştır ve Değiştir: CAS Kalıpları
compare_exchange_weak ve compare_exchange_strong ile kilitsiz güncellemeler uygulayın
Karşılaştır ve Değiştir: CAS Kalıpları, CoddyKit'te ücretsiz bir C++ Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C++ Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C++ Academy kursu toplamda 4 dersten oluşur.
CAS Temel İşlemi
Karşılaştır ve değiştir, değeri atomik olarak okur, karşılaştırır ve koşullu olarak yazar. Çoğu kilitsiz algoritmanın temelidir.
C++ Karşılaştırarak Değiştirme
std::atomic içinde iki çeşidi vardır:
compare_exchange_strong(expected, desired)— mevcut değer expected değerine eşit olduğunda başarılı olurcompare_exchange_weak(expected, desired)— görünürde başarısız olabilir
Bir CAS Döngüsünün Yapısı
Klasik CAS döngüsü: okuyun, hesaplayın, yazmayı deneyin. Başka bir iş parçacığı yarışı kazanırsa yeniden deneyin.
std::atomic<int> a{0};
int old = a.load();
int next;
do {
next = compute_new(old);
} while (!a.compare_exchange_weak(old, next));Atomik Güncelleme için CAS
Yeni değer eski değere bağlı olduğunda CAS kullanın. Doğrudan store kullanmak, eşzamanlı iş parçacıklarının güncellemelerini kaybettirir.
// Atomic max
int current = a.load();
while (newval > current && !a.compare_exchange_weak(current, newval));Kilitsiz Yığın: push
Basit bir kilitsiz yığın push işlemi, yeni bir düğümü başa yerleştirmek için CAS kullanır.
struct Node { int value; Node* next; };
std::atomic<Node*> head{nullptr};
void push(int v) {
Node* n = new Node{v, nullptr};
n->next = head.load();
while (!head.compare_exchange_weak(n->next, n));
}Yalancı Başarısızlık
compare_exchange_weak, değerler eşleştiğinde bile başarısız olabilir; bunun nedeni, temelindeki yönergenin başarısız olmasına izin verilen ARM gibi platformlardır. Bunu döngülerin içinde kullanın; yeniden denemenin maliyetli olduğu durumlarda strong kullanın.
Güncelleme Deseni: Sıfırlama
Bir değeri, değişmemiş olması koşuluyla bilinen bir duruma sıfırlamak için kullanılır.
int expected = 42;
if (a.compare_exchange_strong(expected, 0)) {
// a was 42 and is now 0
}Yapı Taşı: Atomik Sayaç
Basit bir sayaç için fetch_add, CAS döngüsünden daha kolay ve hızlıdır.
Yapı Taşı: Atomik Bayrak
Basit bir mantıksal bayrak için std::atomic_flag, std::atomic<bool> türünden daha hafiftir ve test_and_set işlemini destekler.
Eşzamanlılık Üzerine Akıl Yürütme
Kilitsiz kodun anlaşılması son derece zordur. Titiz testler (TSan, rastgele veriyle test), kullanılabildiğinde biçimsel modeller kullanın ve sahada sınanmış mevcut uygulamaları tercih edin.
CAS Ne Zaman Seçilmeli
CAS'ı şu durumlarda kullanın:
- Birden çok iş parçacığı aynı değeri sık sık güncelliyorsa
- Karşılıklı dışlama kilitleri çekişme nedeniyle darboğaz oluşturuyorsa
- Kritik bölüm çok kısa ve basitse
CAS Ne Zaman Kullanılmamalı
CAS'tan şu durumlarda kaçının:
- Güncelleme birkaç işlemden fazlasını gerektiriyorsa
- Doğruluk, iş hacminden daha önemliyse
- Ekibin kilitsiz programlama konusunda uzmanlığı yoksa
Hızlı Kontrol
compare_exchange_weak işlemini neden genellikle bir döngünün içinde kullanırız?
Özet
Karşılaştır ve değiştir, bir değeri yalnızca beklenen değere eşitse atomik olarak günceller. CAS döngüleri, eşzamanlı güncellemeleri kilit kullanmadan işler. Döngülerin içinde compare_exchange_weak, tek seferlik denemelerde ise strong kullanın.
Sıkça Sorulan Sorular
“Karşılaştır ve Değiştir: CAS Kalıpları” dersi ücretsiz mi?
Evet — “Karşılaştır ve Değiştir: CAS Kalıpları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C++ Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C++ Academy kursu toplamda 4 dersten oluşur.
“Karşılaştır ve Değiştir: CAS Kalıpları” dersinde ne öğreneceğim?
compare_exchange_weak ve compare_exchange_strong ile kilitsiz güncellemeler uygulayın C++ Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C++ Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C++ Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Karşılaştır ve Değiştir: CAS Kalıpları” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C++ Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C++ Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- std::atomic ve Bellek Sıraları
- Karşılaştır ve Değiştir: CAS Kalıpları
- Kilitsiz Kuyruk Uygulaması
- Tehlike İşaretçileri ve ABA Sorunu