Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      atomic_fetch_add, atomic_fetch_add_explicit

      From cppreference.com
      <c‎ |atomic
       
       
      Concurrency support library
       
      Defined in header<stdatomic.h>
      C atomic_fetch_add(volatile A* obj, M arg);
      (1)(since C11)
      C atomic_fetch_add_explicit(volatile A* obj, M arg,memory_order order);
      (2)(since C11)

      Atomically replaces the value pointed byobj with the result of addition ofarg to the old value ofobj, and returns the valueobj held previously. The operation is read-modify-write operation. The first version orders memory accesses according tomemory_order_seq_cst, the second version orders memory accesses according toorder.

      This is ageneric function defined for allatomic object typesA. The argument is pointer to a volatile atomic type to accept addresses of both non-volatile andvolatile (e.g. memory-mapped I/O) atomic objects, and volatile semantic is preserved when applying this operation to volatile atomic objects.M is either the non-atomic type corresponding toA ifA is atomic integer type, orptrdiff_t ifA is atomic pointer type.

      It is unspecified whether the name of a generic function is a macro or an identifier declared with external linkage. If a macro definition is suppressed in order to access an actual function (e.g. parenthesized like(atomic_fetch_add)(...)), or a program defines an external identifier with the name of a generic function, the behavior is undefined.

      For signed integer types, arithmetic is defined to use two’s complement representation. Thereare no undefined results. For pointer types, the result may be an undefined address, but the operations otherwise have no undefined behavior.

      Contents

      [edit]Parameters

      obj - pointer to the atomic object to modify
      arg - the value to add to the value stored in the atomic object
      order - the memory synchronization ordering for this operation: all values are permitted

      [edit]Return value

      The value held previously by the atomic object pointed to byobj.

      [edit]Example

      Run this code
      #include <stdio.h>#include <threads.h>#include <stdatomic.h> atomic_int acnt;int cnt; int f(void* thr_data){for(int n=0; n<1000;++n){        atomic_fetch_add_explicit(&acnt,1,memory_order_relaxed);// atomic++cnt;// undefined behavior, in practice some updates missed}return0;} int main(void){thrd_t thr[10];for(int n=0; n<10;++n)thrd_create(&thr[n], f,NULL);for(int n=0; n<10;++n)thrd_join(thr[n],NULL); printf("The atomic counter is %u\n", acnt);printf("The non-atomic counter is %u\n", cnt);}

      Possible output:

      The atomic counter is 10000The non-atomic counter is 9511

      [edit]References

      • C17 standard (ISO/IEC 9899:2018):
      • 7.17.7.5 The atomic_fetch and modify generic functions (p: 208)
      • C11 standard (ISO/IEC 9899:2011):
      • 7.17.7.5 The atomic_fetch and modify generic functions (p: 284-285)

      [edit]See also

      atomic subtraction
      (function)[edit]
      C++ documentation foratomic_fetch_add,atomic_fetch_add_explicit
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=c/atomic/atomic_fetch_add&oldid=138692"

      [8]ページ先頭

      ©2009-2025 Movatter.jp