Atomics
- C kursu
- Uzman
- Ders 28/47
- 5 dk
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
#include <stdio.h>
#include <stdatomic.h>
// atomik sayaç tanımla
// iki kez artır
// sonucu yazdırÖrnek çözüm
#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
atomic_int counter = 0;
atomic_fetch_add(&counter, ____);
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 |