atomic 注释13:函 _Atomic_wait_compare_non_lock_free (), _Atomic_wait_compare_16_bytes () 与指令 CMPXCHG16B

(36)函 _Atomic_wait_compare_non_lock_free (),该函数可以原子性的完成内存复制,并判断复制的字节是否为 0 ,源代码如下:

// 本函数在获取锁 _Spinlock_raw 以后,原子性的比较地址 _Storage 与地址 _Comparand 处
// 开始的 _Size 个字节的数据是否相等。是则返回 true,不等返回 fasle。
// 本函数的功能是给普通的比较函数 memcmp(..) 加上了原子保护。
template <class _Spinlock_t>                        
bool __stdcall _Atomic_wait_compare_non_lock_free      // 本函数调用了上面的俩锁等待与锁释放函数
( const void* _Storage, void* _Comparand, size_t _Size, void* _Spinlock_raw) noexcept
{
    _Spinlock_t& _Spinlock = *static_cast<_Spinlock_t*>(_Spinlock_raw); // 转换成模板参数的类型

    _Atomic_lock_acquire(_Spinlock);     // 忙等待,以获得自旋锁的使用权

    const auto _Cmp_result = _CSTD memcmp(_Storage, _Comparand, _Size); // 内存中的数据比较
    //int memcmp( void const* _Buf1, void const* _Buf2, size_t _Size );相等返回 0

    _Atomic_lock_release(_Spinlock);     // 释放自旋锁

    return _Cmp_result == 0;             // 形参 1 和 2 相等则返回 true 。
}

++ 举例测试一下:

在这里插入图片描述

(37)函数 _Atomic_wait_compare_16_bytes () 与指令 CMPXCHG16B,先介绍这个指令。但在旧版本的 x64 CPU 上没有这个指令,所以本 STL 库代码创造了这个函数来实现同样的功能:

在这里插入图片描述

++ 该函数的代码如下。如果理解了 atomic 对少字节的操作。 16 字节的数据操作可以类比着来理解,本函数因为调用链里缺乏源代码,所以目前还不能完全理解。只记录一下代码:

// 本函数适用于低版本的 x64 CPU 上运行 win64 系统,而没有 cmpxchg16b 指令的情形。
// 本函把 16 字节的形参1 与形参 2 交换,交换成功则返回 true。
inline bool __stdcall _Atomic_wait_compare_16_bytes
(const void* _Storage, void* _Comparand, size_t, void*) noexcept 
{
    const auto _Dest              = static_cast<long long*>(const_cast<void*>(_Storage));
    const auto _Cmp               = static_cast<const long long*>(_Comparand);
    alignas(16) long long _Tmp[2] = {_Cmp[0], _Cmp[1]};

    return _STD_COMPARE_EXCHANGE_128(_Dest, _Tmp[1], _Tmp[0], _Tmp) != 0;
/*
// 看起来是旧主机用一个函数来完成 16 字节的原子交换操作,以替换和实现 cmpxchg16b 指令的功能。
u_char  __std_atomic_compare_exchange_128
( long long* Destination, long long ExchangeHigh, long long ExchangeLow , long long* ComparandResult);

#define   _STD_COMPARE_EXCHANGE_128   __std_atomic_compare_exchange_128
*/
}

(38)

谢谢

【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器模拟器的研究展开,重点介绍了基于Matlab的建模仿真方法。通过对四轴飞行器的动力学特性进行分析,构建了非线性状态空间模型,并实现了姿态位置的动态模拟。研究涵盖了飞行器运动方程的建立、控制系统设计及数值仿真验证等环节,突出非线性系统的精确建模仿真优势,有助于深入理解飞行器在复杂工况下的行为特征。此外,文中还提到了多种配套技术如PID控制、状态估计路径规划等,展示了Matlab在航空航天仿真中的综合应用能力。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程技术人员,尤其适合研究生及以上层次的研究者。; 使用场景及目标:①用于四轴飞行器控制系统的设计验证,支持算法快速原型开发;②作为教学工具帮助理解非线性动力学系统建模仿真过程;③支撑科研项目中对飞行器姿态控制、轨迹跟踪等问题的深入研究; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注动力学建模控制模块的实现细节,同时可延伸学习文档中提及的PID控制、状态估计等相关技术内容,以全面提升系统仿真分析能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangzhangkeji

谢谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值