CodeBlanks Logo Icon CodeBlanks

Atomics

stdatomic.h ile atomik işlemleri öğrenirsin.

stdatomic.h atomik işlemler

stdatomic.h başlığı, C11 ile gelen atomik işlemleri sağlar. atomic_int tipi, kesilmez (bölünmez) artış ve azalış işlemleri sunar. atomic_fetch_add(&counter, 1) çağrısı, sayacı atomik olarak artırır.

Atomik işlemler, iş parçacığı güvenliği için önemlidir. Normal counter++ ifadesi üç makine komutudur (oku, artır, yaz); iki iş parçacığı aynı anda yaparsa bir artış kaybolabilir. atomic_fetch_add ise tek bölünmez komuttur; bu tür veri yarışını (data race) önler. Hafıza sıralaması (memory order) da bu başlıkta denetlenir; memory_order_relaxed en zayıf, memory_order_seq_cst en güçlü sıralamadır.

Hafıza sıralaması

Atomik işlemlerin davranışı hafıza sıralaması (memory order) ile denetlenir. Varsayılan memory_order_seq_cst, en güçlü ve en güvenli sıralamadır; tüm iş parçacıkları aynı sırayı görür.

memory_order_relaxed ise en zayıf sıralamadır; yalnızca atomiklik garanti edilir, sıralama değil. Bu, performans için kullanılır ama dikkat gerektirir. atomic_fetch_add_explicit(&counter, 1, memory_order_relaxed) biçiminde açıkça belirtilebilir. Çoğu durumda varsayılan sıralama yeterlidir; yalnızca profil çıktıktan sonra daha zayıf sıralamaya geçilir.

Uygulama Atomik sayaç yaz

#include <stdatomic.h> ekle. int main(void) içinde atomic_int counter = 0; tanımla. atomic_fetch_add(&counter, 1) çağrısını iki kez yap. printf("%d\n", counter) ile sonucu yazdır.

Başlangıç kodu

main.c
#include <stdio.h>
#include <stdatomic.h>

// atomik sayaç tanımla
// iki kez artır
// sonucu yazdır

Örnek çözüm

main.c
#include <stdio.h>
#include <stdatomic.h>

int main(void) {
    atomic_int counter = 0;
    atomic_fetch_add(&counter, 1);
    atomic_fetch_add(&counter, 1);
    printf("%d\n", counter);
    return 0;
}

Beklenen çıktı

2

Soru ve cevaplar

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

1 Hangi başlık atomik işlemleri sağlar?

  • <atomic.h>
  • <sync.h>
  • <thread.h>
  • <stdatomic.h> Doğru cevap

Açıklama: stdatomic.h başlığı C11 atomik işlemlerini içerir.

2 atomic_fetch_add çağrısını tamamla

Soru
atomic_int counter = 0;
atomic_fetch_add(&counter, ____);
Cevap
atomic_int counter = 0;
atomic_fetch_add(&counter, 1);

Açıklama: atomic_fetch_add(&counter, 1) sayacı bir artırır.

3 Atomik işlevi eşle

Kavram Anlamı
atomic_fetch_add Atomik artış
atomic_fetch_sub Atomik azalış
atomic_load Atomik okuma
atomic_store Atomik yazma

Uzman bölümündeki tüm dersler