NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
原子内存序

原子内存顺序行为 更多...

原子内存序 的协作图:

枚举

enum class  memory_order : int32_t {
  memory_order::relaxed , memory_order::consume , memory_order::acquire , memory_order::release ,
  memory_order::acq_rel , memory_order::seq_cst
}
 内存顺序 更多...
enum class  memory_order_modifier : int64_t {
  memory_order_modifier::memory_order_none = 0 , memory_order_modifier::memory_order_mask = 0x0000ffff , memory_order_modifier::memory_order_modifier_mask = 0xffff0000 , memory_order_modifier::memory_order_hle_acquire = 0x10000 ,
  memory_order_modifier::memory_order_hle_release = 0x20000 , memory_order_modifier::memory_order_rtm_begin = 0x40000 , memory_order_modifier::memory_order_rtm_end = 0x80000 , memory_order_modifier::memory_order_rtm_abort = 0x100000
}
 内存顺序修饰符枚举 更多...
enum class  rtm_status_flag : uint32_t {
  rtm_status_flag::xabort_explicit = 1 << 0 , rtm_status_flag::retry_possible = 1 << 1 , rtm_status_flag::memory_conflict = 1 << 2 , rtm_status_flag::buffer_overflow = 1 << 3 ,
  rtm_status_flag::debug_hit = 1 << 4 , rtm_status_flag::nested_abort = 1 << 5
}
 RTM事务状态标志位定义 更多...

函数

constexpr memory_order operator| (memory_order mo, memory_order_modifier mod) noexcept
 内存顺序与修饰符的或操作符
constexpr memory_order operator& (memory_order mo, memory_order_modifier mod) noexcept
 内存顺序与修饰符的与操作符
constexpr memory_order cmpexch_failure_order (const memory_order mo) noexcept
 获取原子比较交换操作失败时的内存顺序
constexpr bool is_valid_cmpexch_failure_order (const memory_order mo) noexcept
 检查比较交换失败内存顺序是否有效

变量

constexpr auto memory_order_relaxed = memory_order::relaxed
 宽松内存顺序常量
constexpr auto memory_order_consume = memory_order::consume
 数据依赖内存顺序常量
constexpr auto memory_order_acquire = memory_order::acquire
 获取内存顺序常量
constexpr auto memory_order_release = memory_order::release
 释放内存顺序常量
constexpr auto memory_order_acq_rel = memory_order::acq_rel
 获取-释放内存顺序常量
constexpr auto memory_order_seq_cst = memory_order::seq_cst
 顺序一致性内存顺序常量

详细描述

原子内存顺序行为

遵循的国际标准

本实现严格遵循以下并发编程与内存模型相关标准规范:

硬件架构规范(内存屏障与指令集参考):

事务内存扩展规范:

内存顺序语义

根据 ISO/IEC 14882:2020 §31.4,六种内存顺序语义如下:

内存顺序 枚举值 语义说明
relaxed 0 最宽松:仅保证原子性,无同步或顺序约束
consume 1 数据依赖:依赖该值的操作不会被重排到前面(通常由编译器优化为 acquire)
acquire 2 获取语义:后续读写不会被重排到该操作之前
release 3 释放语义:之前的读写不会被重排到该操作之后
acq_rel 4 获取-释放组合:兼具 acquire 和 release 语义
seq_cst 5 顺序一致性:全局单一总顺序,最严格的同步

同步模式

根据 C++ 内存模型,不同内存顺序构成以下同步关系:

模式 存储操作 加载操作 同步效果
Relaxed relaxed relaxed 无同步,仅保证原子性
Release-Acquire release acquire 释放-获取同步,构成 happens-before
Release-Consume release consume 释放-消费同步(依赖排序)
Sequential seq_cst seq_cst 全局顺序一致性

内存屏障等价

各内存顺序在不同硬件架构上的内存屏障指令等价:

内存顺序 x86/x64 指令 ARMv8 指令 说明
relaxed 无(mov) 无(ldr/str) 无屏障
acquire 编译器屏障(mov + 约束) LDAR 加载-获取
release 编译器屏障(mov + 约束) STLR 存储-释放
acq_rel mfence(或 lock xchg) LDAR + STLR 组合 完全屏障
seq_cst mfence(或 lock xadd) DMB ISH 顺序一致性屏障
注解
x86/x64 架构提供相对强的内存模型(TSO),load 自带 acquire 语义, store 自带 release 语义,因此 relaxed、acquire、release 通常仅需编译器屏障。

比较交换失败顺序规则

根据 ISO/IEC 14882:2020 §31.8.2,compare_exchange 操作的失败内存顺序必须满足:

  • 不能为 releaseacq_rel(失败时不执行存储操作)
  • 不能强于成功时的内存顺序

本实现提供的转换规则:

  • acq_rel 失败 → acquire
  • release 失败 → relaxed
  • 其他情况保持不变

硬件锁消除(HLE)修饰符

HLE 是 Intel TSX 扩展的一部分,允许将锁前缀的原子操作转换为事务执行:

修饰符 语义
memory_order_hle_acquire 0x10000 事务开始(相当于 XACQUIRE 前缀)
memory_order_hle_release 0x20000 事务结束(相当于 XRELEASE 前缀)
注解
HLE 修饰符仅在支持 Intel TSX 的处理器上有效,在不支持的平台上自动退化为普通原子操作。
警告
**已弃用声明**:根据 Intel 的安全公告与软件开发者手册更新, Intel® TSX 指令集扩展(包括 HLE 和 RTM)已在后续处理器中被弃用或默认禁用。 使用此特性前,必须通过 CPUID 检查处理器是否支持 HLE 功能,并在运行时做好 fallback 处理。

RTM指令集

RTM(Restricted Transactional Memory)是Intel TSX扩展的另一种事务内存模式, 通过XBEGIN/XEND/XABORT指令提供显式的事务控制。

与HLE的区别:

  • HLE:硬件自动处理,对程序员透明,使用锁前缀触发
  • RTM:程序员显式控制事务边界,需提供fallback路径
指令 操作码 说明
XBEGIN C7 F8 开始事务,失败时跳转到fallback地址
XEND 0F 01 D5 结束事务
XABORT C6 F8 显式中止事务,可附带8位状态码
XTEST 0F 01 D6 检测是否在事务中
警告
根据Intel的安全公告与软件开发者手册更新,Intel® TSX指令集扩展(包括HLE和RTM) 已在后续处理器中被弃用或默认禁用。使用此特性前,必须通过CPUID检查处理器是否支持 RTM功能,并在运行时做好fallback处理。

事务中止状态码

通过XABORT指令和事务中止时EAX寄存器的值可以判断中止原因:

状态位 含义
EAX[0] XABORT显式中止
EAX[1] 可能重试成功
EAX[2] 内存冲突引起的中止
EAX[3] 缓冲区溢出
EAX[4] 调试断点命中
EAX[5] 嵌套事务中止

实现细节

特性 规范参数
内存顺序基类型 int32_t(与 C 标准兼容)
修饰符基类型 int64_t(预留扩展空间)
顺序掩码 0x0000ffff(低 16 位)
修饰符掩码 0xffff0000(高 16 位)
修饰符位宽 16 位(支持最多 65536 种修饰符)

使用指南

  • **性能优先**:使用 relaxed 进行简单计数
  • **生产者-消费者**:生产者使用 release,消费者使用 acquire
  • **引用计数**:增加计数使用 relaxed,减少计数使用 acq_rel
  • **互斥锁实现**:获取锁使用 acquire,释放锁使用 release
  • **全局顺序要求**:使用 seq_cst(默认且最安全,但性能代价最大)
警告
错误使用内存顺序可能导致:
  • 数据竞争(未定义行为)
  • 死锁或活锁
  • 内存可见性问题(读旧值)
  • 平台间移植性问题(强/弱内存模型差异)
参见
https://en.cppreference.com/w/cpp/atomic/memory_order
https://www.intel.com/content/www/us/en/docs/programmable/683364/current/transactional-synchronization-extensions.html
https://developer.arm.com/documentation/100941/0101/Memory-ordering

枚举类型说明

◆ memory_order

enum class memory_order : int32_t
strong

内存顺序

定义原子操作的内存顺序语义,控制不同线程间的内存可见性顺序。

枚举值
relaxed 

最宽松的内存顺序,只保证原子性

consume 

数据依赖顺序,用于依赖读取的场景

acquire 

获取操作,确保后续读写不会被重排到前面

release 

释放操作,确保前面的读写不会被重排到后面

acq_rel 

获取-释放组合操作

seq_cst 

顺序一致性,最严格的内存顺序

在文件 memory_order.hpp163 行定义.

◆ memory_order_modifier

enum class memory_order_modifier : int64_t
strong

内存顺序修饰符枚举

用于扩展memory_order的功能,支持硬件锁消除(HLE)等高级特性。

警告
根据 Intel 的安全公告与软件开发者手册更新,Intel® TSX 指令集扩展(包括 HLE 和RTM)已在后续处理器中被弃用或默认禁用。使用此特性前,必须通过 CPUID 检查处理器是否支持 HLE 功能,并在运行时做好fallback 处理。
参见
https://www.intel.com/content/www/us/en/docs/cpp-compiler/developer-guide-reference/2021-8/intel-transactional-synchronization-extensions.html
枚举值
memory_order_none 

无修饰符

memory_order_mask 

内存顺序掩码

memory_order_modifier_mask 

修饰符掩码

memory_order_hle_acquire 

HLE获取修饰符

memory_order_hle_release 

HLE释放修饰符

memory_order_rtm_begin 

RTM事务开始修饰符

memory_order_rtm_end 

RTM事务结束修饰符

memory_order_rtm_abort 

RTM事务中止修饰符

在文件 memory_order.hpp201 行定义.

◆ rtm_status_flag

enum class rtm_status_flag : uint32_t
strong

RTM事务状态标志位定义

警告
根据 Intel 的安全公告与软件开发者手册更新,Intel® TSX 指令集扩展(包括 HLE 和RTM)已在后续处理器中被弃用或默认禁用。使用此特性前,必须通过 CPUID 检查处理器是否支持 HLE 功能,并在运行时做好fallback 处理。
参见
https://www.intel.com/content/www/us/en/docs/cpp-compiler/developer-guide-reference/2021-8/intel-transactional-synchronization-extensions.html
枚举值
xabort_explicit 

由XABORT指令显式中止

retry_possible 

重试可能成功

memory_conflict 

与其他逻辑处理器内存冲突

buffer_overflow 

事务缓冲区溢出

debug_hit 

调试断点命中

nested_abort 

嵌套事务中止

在文件 memory_order.hpp248 行定义.

函数说明

◆ cmpexch_failure_order()

memory_order cmpexch_failure_order ( const memory_order mo)
constexprnoexcept

获取原子比较交换操作失败时的内存顺序

对于原子比较交换(compare-exchange)操作,成功和失败的内存顺序可以不同。 此函数根据给定的内存顺序,返回对应的失败内存顺序。

转换规则:

在文件 memory_order.hpp272 行定义.

引用了 memory_order_acq_rel, memory_order_acquire, memory_order_mask, memory_order_modifier_mask, memory_order_relaxed , 以及 memory_order_release.

被这些函数引用 atomic< T >::compare_exchange_strong(), atomic< T >::compare_exchange_strong(), atomic< shared_ptr< T > >::compare_exchange_strong(), atomic< weak_ptr< T > >::compare_exchange_strong(), atomic_base< char >::compare_exchange_strong(), atomic_base< char >::compare_exchange_strong(), atomic_base< T * >::compare_exchange_strong(), atomic_base< T * >::compare_exchange_strong(), atomic_float_base< Float >::compare_exchange_strong(), atomic_float_base< Float >::compare_exchange_strong(), atomic_ref_base< Float, false, true >::compare_exchange_strong(), atomic_ref_base< T, false, false >::compare_exchange_strong(), atomic_ref_base< T, true, false >::compare_exchange_strong(), atomic< T >::compare_exchange_weak(), atomic< T >::compare_exchange_weak(), atomic_base< char >::compare_exchange_weak(), atomic_base< char >::compare_exchange_weak(), atomic_base< T * >::compare_exchange_weak(), atomic_base< T * >::compare_exchange_weak(), atomic_float_base< Float >::compare_exchange_weak(), atomic_float_base< Float >::compare_exchange_weak(), atomic_ref_base< Float, false, true >::compare_exchange_weak(), atomic_ref_base< T, false, false >::compare_exchange_weak() , 以及 atomic_ref_base< T, true, false >::compare_exchange_weak().

◆ is_valid_cmpexch_failure_order()

◆ operator&()

memory_order operator& ( memory_order mo,
memory_order_modifier mod )
constexprnoexcept

内存顺序与修饰符的与操作符

参数
mo内存顺序
mod内存顺序修饰符
返回
提取后的内存顺序
注解
用于从组合值中提取特定的内存顺序或修饰符

在文件 memory_order.hpp232 行定义.

引用了 mod().

◆ operator|()

memory_order operator| ( memory_order mo,
memory_order_modifier mod )
constexprnoexcept

内存顺序与修饰符的或操作符

参数
mo内存顺序
mod内存顺序修饰符
返回
组合后的内存顺序
注解
用于将内存顺序与修饰符组合使用

在文件 memory_order.hpp220 行定义.

引用了 mod().