BG MVC Model View Controller eğitim serisi yayında...

Ana sayfa > Programlama > C Programlama > C standart kütüphanesi > <stdatomic.h> (C11) > atomic_fetch_add

atomic_fetch_add() fonksiyonu

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.