CodeBlanks Logo Icon CodeBlanks

Fetch and add

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

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

int main() {
    // atomic oluştur, fetch_add ile eski ve yeni değeri yazdır
    return 0;
}

Örnek çözüm

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

Soru
std::atomic<int> a{10};
int old = a.____(5);
Cevap
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

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