Fetch and add
- C++ kursu
- İleri seviye
- Ders 29/83
- 5 dk
fetch_add ve fetch_sub ile atomik aritmetik öğrenirsin.
fetch_add / fetch_sub
fetch_add(n), atomic değere n ekler ve önceki değeri döndürür. fetch_sub(n) benzer biçimde çıkarır. Her iki işlem de bölünmezdir; aynı anda başka bir iş parçacığı araya giremez. Bu, kilitsiz sayaç için idealdir.
Örnek: std::atomic<int> a{10}; int old = a.fetch_add(5); ile old = 10, a = 15 olur. a += 5; kısa yazımı da aynı sonucu verir. İşlemci düzeyinde bu, tek bir LOCK XADD komutuna dönüşür; mutex gerektirmez.
Atomik aritmetik
std::atomic, temel aritmetik işleçleri aşırı yükler. a += 5; ile a.fetch_add(5); aynıdır; a -= 3; ile a.fetch_sub(3); aynıdır. ++a ve a++ de atomic biçimde çalışır.
Atomik aritmetik, paylaşılan bir sayacı birden fazla iş parçacığında güncellemek için idealdir. mutex'e göre çok daha hızlıdır; lock-free olduğu için bekleme yoktur. Ancak yalnızca tamsayı ve gösterici türleri için geçerlidir; std::atomic<std::string> gibi türlerde aritmetik desteklenmez.
Uygulama fetch_add ile eski değer
std::atomic<int> a{10}; oluştur. int old = a.fetch_add(5); ile ekle ve önceki değeri al. std::cout << old << " " << a.load(); yaz.
Başlangıç kodu
#include <iostream>
#include <atomic>
int main() {
// atomic oluştur, fetch_add ile eski ve yeni değeri yazdır
return 0;
}Örnek çözüm
#include <iostream>
#include <atomic>
int main() {
std::atomic<int> a{10};
int old = a.fetch_add(5);
std::cout << old << " " << a.load();
return 0;
}Beklenen çıktı
10 15
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 fetch_add satırını tamamla
std::atomic<int> a{10};
int old = a.____(5);
std::atomic<int> a{10};
int old = a.fetch_add(5);
Açıklama: a.fetch_add(5) ekler ve önceki değeri döndürür.
2 fetch_add ne döndürür?
- Önceki değeri Doğru cevap
- Yeni değeri
- Bir bool
- Hata kodunu
Açıklama: fetch_add, ekleme öncesi değeri döndürür.
3 İfadeyi rolüne eşle
| Kavram | Anlamı |
|---|---|
a.fetch_add(5) |
Ekle, eski değeri ver |
a.fetch_sub(3) |
Çıkar, eski değeri ver |
a += 5 |
fetch_add kısa yazımı |
++a |
Atomik artırma |