C++ 中的 CAS 操作用于操作原子变量,它是 atomic<T>
的成员函数。
#include <atomic>
template <class T>
struct atomic;
bool compare_exchange_weak(T& expected, T val,
memory_order sync = memory_order_seq_cst) volatile noexcept;
将当前原子变量的内容与 expected
相比较,
- 如果两者相等,则更新当前原子变量的内容为
val
,并返回 true
; - 如果不相等,则将
expected
更新为当前原子变量的内容,并返回 false
。
需要注意的是:在进行判等操作时,它执行的是物理上的比较,即直接比较内存值,而不是使用 T
的 ==
操作符进行比较。
此外,它允许虚假失败,也就是当前原子变量的内容与 expected
相等,但是它仍然返回 false
,但它不会修改 expected
。
它需要放在循环中使用。
如,
struct Node { int value; Node* next; };
std::atomic<Node*> list_head(nullptr);
void insert(int val) {
Node* oldHead = list_head;
Node* newNode = new Node{ val,oldHead };
while (!list_head.compare_exchange_weak(oldHead, newNode)) {
newNode->next = oldHead;
}
}
bool compare_exchange_strong(T& expected, T val,
memory_order sync = memory_order_seq_cst) volatile noexcept;
与 compare_exchange_weak()
大致相似,只是它不允许发生虚假失败。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)