atomic 注释27:测试模板类 atomic<T> 的成员函数 exchange (),比较及强交换 compare_exchange_strong ()

(77)成员函数 exchange () 返回的是原子量的旧值,源码支持如下:

在这里插入图片描述

++ 测试一下

在这里插入图片描述

(78)成员函数 比较及强交换 compare_exchange_strong (),功能主要由 atomic《T》 的父类来实现。源代码如下:

在这里插入图片描述

++ 其父类的简单版源码如下

template <class _Ty, size_t > // 泛化版本
struct _Atomic_storage
{   // 简单情况下 _Spinlock = long 类型。引用情况下 _Spinlock 是 void * 类型。
    mutable typename _Atomic_storage_types<_Ty>::_Spinlock _Spinlock{}; // 定义了一个自旋锁

    using _TVal = remove_reference_t<_Ty>;

    _Ty _Storage{};    // 原子量要保护的数据成员,是个引用,也可以是一个值,都包括了

    // 当本类中存储的值   等于形参1 时,把形参 2 的值存入本类;
    // 当本类中存储的值 不等于形参1 时,把本类中的值写入形参 1 。有点指令 cmpxchg 的语义。
    // 返回值表示形参1 与本类中的值是否相等,是则返回 true。
    bool compare_exchange_strong  // 注意:形参1 是左值引用,对左值引用取地址返回的是原始值的地址
    (_TVal& _Expected, const _TVal _Desired, const memory_order _Order = memory_order_seq_cst)
    {
        _Check_memory_order(_Order);
        const auto _Storage_ptr  = _STD addressof(_Storage) ; // 取本类中数据成员的地址
        const auto _Expected_ptr = _STD addressof(_Expected);
        bool _Result;

        _Guard _Lock{ _Spinlock };         // 取得自旋锁

        _Result = _CSTD memcmp(_Storage_ptr, _Expected_ptr, sizeof(_TVal)) == 0;

        if (_Result)
            _CSTD memcpy(_Storage_ptr, _STD addressof(_Desired), sizeof(_TVal));
        else
            _CSTD memcpy(_Expected_ptr, _Storage_ptr, sizeof(_TVal));

        return _Result;
    }

};

++ 测试一下

在这里插入图片描述

(79)

谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值