Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      atomic_compare_exchange_weak, atomic_compare_exchange_strong, atomic_compare_exchange_weak_explicit, atomic_compare_exchange_strong_explicit

      From cppreference.com
      <c‎ |atomic
       
       
      Concurrency support library
       
      Defined in header<stdatomic.h>
      _Bool atomic_compare_exchange_strong(volatile A* obj,
                                            C* expected, C desired);
      (1)(since C11)
      _Bool atomic_compare_exchange_weak(volatile A*obj,
                                          C* expected, C desired);
      (2)(since C11)
      _Bool atomic_compare_exchange_strong_explicit(volatile A* obj,

                                                     C* expected, C desired,
                                                     memory_order succ,

                                                     memory_order fail);
      (3)(since C11)
      _Bool atomic_compare_exchange_weak_explicit(volatile A*obj,

                                                   C* expected, C desired,
                                                   memory_order succ,

                                                   memory_order fail);
      (4)(since C11)

      Atomically compares the contents of memory pointed to byobj with the contents of memory pointed to byexpected, and if those are bitwise equal, replaces the former withdesired (performs read-modify-write operation). Otherwise, loads the actual contents of memory pointed to byobj into*expected (performs load operation).

      The memory models for the read-modify-write and load operations aresucc andfail respectively. The (1-2) versions usememory_order_seq_cst by default.

      The weak forms ((2) and (4)) of the functions are allowed to fail spuriously, that is, act as if*obj!=*expected even if they are equal. When a compare-and-exchange is in a loop, the weak version will yield better performance on some platforms. When a weak compare-and-exchange would require a loop and a strong one would not, the strong one is preferable.

      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.C is the non-atomic type corresponding toA.

      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_compare_exchange)(...)), or a program defines an external identifier with the name of a generic function, the behavior is undefined.

      Contents

      [edit]Parameters

      obj - pointer to the atomic object to test and modify
      expected - pointer to the value expected to be found in the atomic object
      desired - the value to store in the atomic object if it is as expected
      succ - the memory synchronization ordering for the read-modify-write operation if the comparison succeeds. All values are permitted.
      fail - the memory synchronization ordering for the load operation if the comparison fails. Cannot bememory_order_release ormemory_order_acq_rel and cannot specify stronger ordering thansucc

      [edit]Return value

      The result of the comparison:true if*obj was equal to*exp,false otherwise.

      [edit]Notes

      The behavior ofatomic_compare_exchange_* family is as if the following was executed atomically:

      if(memcmp(obj, expected,sizeof*obj)==0){memcpy(obj,&desired,sizeof*obj);returntrue;}else{memcpy(expected, obj,sizeof*obj);returnfalse;}

      [edit]References

      • C17 standard (ISO/IEC 9899:2018):
      • 7.17.7.4 The atomic_compare_exchange generic functions (p: 207)
      • C11 standard (ISO/IEC 9899:2011):
      • 7.17.7.4 The atomic_compare_exchange generic functions (p: 283-284)

      [edit]See also

      swaps a value with the value of an atomic object
      (function)[edit]
      C++ documentation foratomic_compare_exchange_weak,atomic_compare_exchange_strong,atomic_compare_exchange_weak_explicit,atomic_compare_exchange_strong_explicit
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=c/atomic/atomic_compare_exchange&oldid=138693"

      [8]ページ先頭

      ©2009-2025 Movatter.jp