atomic_fetch_add_explicit函数
概要:
#include <stdatomic.h> C atomic_fetch_add_explicit(volatile A *object, M operand, memory_order order);
描述:
该泛型函数将参数object指向的原子对象值加上参数operand,得到的结果替换参数object指向的原子对象值。该操作是个原子的读-修改-写操作。内存会受参数order值影响。当参数order值为memory_order_seq_cst时,atomic_fetch_add_explicit函数与atomic_fetch_add函数具有相同的语义。该函数适用于原子整数类型对象,但不包括atomic_bool类型对象。
对于有符号整数类型,算术定义使用二进制补码形式表示,并且溢出时进行安静绕回处理(silent wrap-around on overflow);不存在未定义结果。对于地址类型,结果可能是未定义地址,但操作没有未定义行为。
该泛型函数和复合赋值运算符+=几乎等价,区别主要在于:
1、复合赋值运算符+=不能保证是原子操作。
2、复合赋值运算符+=产生的值是对象的更新值;但该泛型函数返回值是原子对象的先前值。
参数:
volatile A *object
指向原子类型对象的指针。
M operand
与参数object指向原子对象值相加的操作数。如果参数object是原子整数类型,参数operand为对应的非原子类型;如果参数object是原子指针类型,参数operand为ptrdiff_t类型。
memory_order order
枚举常量,显式地指定内存顺序。
返回值:
函数返回函数调用生效前参数object指向的原子对象值。
范例:
|
|
输出:
aNumber: 100000
aValue: 100000
number: 73541
number值应小于或者等于100000,不一定就是73541。复合赋值运算是不是原子操作取决于左操作数,如果左操作数是原子对象,则是原子操作;如果左操作数不是原子对象,则不是原子操作。
注:使用Pelles C编译。
相关内容:
atomic_fetch_add | 原子加运算函数。 |
atomic_fetch_sub_explicit | 原子减运算函数。 |
atomic_fetch_or_explicit | 原子按位或运算函数。 |
atomic_fetch_xor_explicit | 原子按位异或运算函数。 |
atomic_fetch_and_explicit | 原子按位与运算函数。 |