[modern c++] compare_exchange_weak 与 CAS

本文深入解析了 compare_exchange_weak 操作的逻辑,包括其伪码实现和内存比较交换的过程。该操作涉及三个关键值,并在内存值与预期值相等时更新内存。通过一个例子展示了 compare_exchange_weak 在原子变量上的用法,以及在循环中确保交换成功的策略。同时,讨论了在某些平台可能存在的错误返回情况,并提供了循环检查的语义解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:

https://blog.youkuaiyun.com/yand789/article/details/27324295

汇编实现:https://www.jianshu.com/p/fa6d9d9c63b4

 

compare_exchange_weak 的伪码逻辑:

if *(目标内存地址) == expected:

    *(目标内存地址) = desired;
    return true;

else:

    expected = *(目标内存地址);
    return false;

这里涉及到 三个值:

1)要检查的内存 中的值 ;

2)希望 需要检查的内存中 内应当是什么值  expected ;          (对应compare)

3)如果 需要检查的内存 中的存放的值 和 expected 一致,那么使用新值重新填充 需要检查的内存,否则使用需要检查的内存的当前值填充expected。   (对应exchange)

 

If current value of the memory location is equal to the old value, then the new value is written to the memory. In other word, we can write value into target memory only if we know the old value in the memory.

对于 指定内存位置,我们认为它应该是什么值 和 它此时此刻是什么值 如果相等,CAS或者CSW才会成功。

 

函数原型:

bool compare_exchange_weak( T& expected, T desired,
                            std::memory_order success,
                            std::memory_order failure );

用法:

std::atomic<bool> b;
bool expected;
//如果b == expected,则b = true,如果 b!=expected,则expected = b
b.compare_exchange_weak(expected,true,memory_order_acq_rel,memory_order_acquire);

通常在进行 compare_exchange_weak 后会检查 expected的值来判断本次交换是否成功。

有些平台上compare_exchange_weak可能会错误返回,所以万无一失的方法是进行loop判断:

bool expected=false;
extern atomic<bool> b; // set somewhere else
while(!b.compare_exchange_weak(expected,true) && !expected);

循环检查的语义:

检查指定内存中的值和期望的是不是一样,如果是则把希望赋予的新值写入指定内存,如果不是则读出内存中的值写入expected中(函数原型中要求expected必须是一个引用这样才能写入,所以必须是左值,右值不能作为expected),然后进入下一次循环,新的循环中expected中存的是内存地址中最新的值,因为上一次读的时候发现值不匹配(这里的不匹配是指我希望的和内存中的不匹配,如果我希望的本身就是风马牛不相及的值,第二次便会被自动设置成内存中的值,这样第二次比较才会有意义),所以再读一次。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值