Bildirim
C atomic_fetch_add(volatile A *obj, M arg); (C11)
C atomic_fetch_add_explicit(volatile A *obj, M arg, memory_order order); (C11)
Açıklama
Obj parametresi ile gösterilen bellek içeriğini arg ile gösterilen bellek içeriğinin obj değişkeninin önceki değeri ile toplamı ile değiştirir ve daha önce obj parametresinde yer alan değeri geri döndürür. İşlem okuma-değiştirme-yazma işlemidir.
Bu fonksiyon A türündeki tüm atomik değişken türleri için tanımlanan genel bir fonksiyondur.
Parametreler
obj: Değiştirilecek atomik değişken işaretçisidir.
arg: Atomik değişkende yüklü değere eklenecek değeri gösterir.
order: Bu işlem için bellek senkronizasyon sıralaması: Tüm değerlere izin verilir.
Dönüş değeri
İşlem öncesinde obj parametresinde yer alan atomik değişken değeri geri döndürülür.
Örnek
#include <stdio.h>
#include <pthread.h>
#include <stdatomic.h>
#define NUMTHREADS 100
int atomic_counter;
int non_atomic_counter;
void* bgthread(void *arg) {
int id;
for (id=0; id<100; ++id) {
++non_atomic_counter;
atomic_fetch_add(&atomic_counter, 1);
}
return NULL;
}
int main(void) {
int id;
pthread_t threads[NUMTHREADS];
for (id=0; id<NUMTHREADS; ++id)
pthread_create(&threads[id], NULL, bgthread, NULL);
for (id=0; id<NUMTHREADS; ++id)
pthread_join(threads[id], NULL);
printf("Atomik değer : %d\n", atomic_counter);
printf("Atomik olmayan değer: %d\n", non_atomic_counter);
}
Yukarıdaki örnekte, program aşağıdaki satırları ekrana yazar:
Atomik değer : 10000 Atomik olmayan değer: 10000
Yukarıdaki program, program altında 100 adet thread oluştururken her defasında bgthread fonksiyonunu çalıştırır. Bu fonksiyon içinde artırılan atomik ve atomik olmayan global değişken değerlerini ekrana yazar.