atomic_compare_exchange_weak_explicit函数
概要:
#include <stdatomic.h> _Bool atomic_compare_exchange_weak_explicit( volatile A *object, C *expected, C desired, memory_order success, memory_order failure);
描述:
该泛型函数比较参数object指向原子对象的内存内容与参数expected指向对象的内存内容是否相等。如果相等,将使用参数desired的内存内容替换参数object指向原子对象的内存内容,并且内存会受参数success值影响;如果不相等,将使用参数object指向原子对象的内存内容更新参数expected指向对象的内存内容,并且内存会受参数failure值影响。该操作是个原子的读-修改-写操作。当memory_order类型参数值为memory_order_seq_cst时,atomic_compare_exchange_weak_explicit函数与atomic_compare_exchange_weak函数具有相同的语义。
参数failure不应是memory_order_release或者memory_order_acq_rel。参数failure标识的内存顺序不能强于参数success标识的内存顺序。
该函数可能会出现伪失败(fail spuriously);即使参数object指向原子对象的内存内容与参数expected指向对象的内存内容相等时,该函数仍可能返回false,并将最初存在的相同内存内容存储回参数expected。这种伪失败可以在更广泛的机器上实现比较和交换操作,例如:LL/SC机(load_locked store_conditional machines)。
伪失败的结果是几乎所有atomic_compare_exchange_weak_explicit函数的使用都是在循环中,例如:
expected = atomic_load(&object); do{ desired = function(expected); }while(!atomic_compare_exchange_weak_explicit(&object, &expected, desired, success, failure));
当比较和交换操作在循环中时,atomic_compare_exchange_weak函数和atomic_compare_exchange_weak_explicit函数在某些平台上具有更好的性能。当使用atomic_compare_exchange_weak函数或者atomic_compare_exchange_weak_explicit函数需要循环,但使用atomic_compare_exchange_strong函数或者atomic_compare_exchange_strong_explicit函数不需要循环时,这种情况下atomic_compare_exchange_strong函数和atomic_compare_exchange_strong_explicit函数更可取。
参数:
指向原子类型对象的指针。
指向对应的非原子类型对象的指针。
对应的非原子类型对象。
枚举常量,显式地指定内存顺序。
枚举常量,显式地指定内存顺序。
返回值:
函数返回比较结果;如果参数object指向原子对象的内存内容与参数expected指向对象的内存内容相等,函数返回true;如果参数object指向原子对象的内存内容与参数expected指向对象的内存内容不相等,函数返回false。
范例:
|
|
输出:
aNumber: 90000
注:使用Pelles C编译。
相关内容:
atomic_store_explicit | 替换原子对象值的函数。 |
atomic_load_explicit | 读取原子对象值的函数。 |
atomic_exchange_explicit | 读取并替换原子对象值的函数。 |
atomic_compare_exchange_strong_explicit | 根据比较结果,更新值的函数。 |
atomic_compare_exchange_weak | 根据比较结果,更新值的函数。 |