(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)
谢谢