atomic_compare_exchange_weak函数
概要:
#include <stdatomic.h> bool atomic_compare_exchange_weak(volatile A *object, C *expected, C desired);
描述:
该泛型函数原子地比较参数object指向原子对象的内存内容与参数expected指向对象的内存内容是否相等。如果相等,将使用参数desired的内存内容替换参数object指向原子对象的内存内容;如果不相等,将使用参数object指向原子对象的内存内容更新参数expected指向对象的内存内容。该操作是原子的读-修改-写操作。
(注:该操作常用于实现无锁数据结构或者自旋锁。该操作是CAS操作(Compare-And-Swap操作);CAS操作提供了一种非阻塞的同步机制,允许线程在不加锁的情况下安全地修改共享变量。)
该函数可能会出现伪失败(fail spuriously);即使参数object指向原子对象的内存内容与参数expected指向对象的内存内容相等时,该函数仍可能返回false,并将最初存在的相同内存内容存储回参数expected。这种伪失败可以在更广泛的机器上实现比较和交换操作,例如:LL/SC机(load_locked store_conditional machines)。
伪失败的结果是几乎所有atomic_compare_exchange_weak函数的使用都在一个循环中,例如:
expected = atomic_load(&object); do{ desired = function(expected); }while(!atomic_compare_exchange_weak(&object, &expected, desired));
当比较和交换操作在循环中时,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函数更可取。
ISO/IEC 9899标准未指定atomic_compare_exchange_weak是宏还是具有外部链接的标识符。如果为访问实际函数而抑制宏定义,或者程序定义了与atomic_compare_exchange_weak同名的外部标识符,其行为是未定义的。
参数:
指向原子类型对象的指针。
指向对应的非原子类型对象的指针。
对应的非原子类型对象。
返回值:
函数返回比较结果;如果参数object指向原子对象的内存内容与参数expected指向对象的内存内容相等,函数返回true;如果参数object指向原子对象的内存内容与参数expected指向对象的内存内容不相等,函数返回false。
范例:
|
|
输出:
aNumber: 90000
相关内容:
| atomic_store | 写入原子对象值的函数。 |
| atomic_load | 读取原子对象值的函数。 |
| atomic_exchange | 读取并替换原子对象值的函数。 |
| atomic_compare_exchange_strong | 根据比较结果,更新值的函数。 |
| atomic_compare_exchange_weak_explicit | 根据比较结果,更新值的函数。 |
主要参考资料: