|
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_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 } |
| 内存顺序修饰符枚举 更多... | |
函数 | |
| 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 |
| 检查比较交换失败内存顺序是否有效 | |
变量 | |
| NEFORCE_INLINE17 constexpr auto | memory_order_relaxed = memory_order::relaxed |
| 宽松内存顺序常量 | |
| NEFORCE_INLINE17 constexpr auto | memory_order_consume = memory_order::consume |
| 数据依赖内存顺序常量 | |
| NEFORCE_INLINE17 constexpr auto | memory_order_acquire = memory_order::acquire |
| 获取内存顺序常量 | |
| NEFORCE_INLINE17 constexpr auto | memory_order_release = memory_order::release |
| 释放内存顺序常量 | |
| NEFORCE_INLINE17 constexpr auto | memory_order_acq_rel = memory_order::acq_rel |
| 获取-释放内存顺序常量 | |
| NEFORCE_INLINE17 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 | 顺序一致性屏障 |
根据 ISO/IEC 14882:2020 §31.8.2,compare_exchange 操作的失败内存顺序必须满足:
本实现提供的转换规则:
HLE 是 Intel TSX 扩展的一部分,允许将锁前缀的原子操作转换为事务执行:
| 修饰符 | 值 | 语义 |
|---|---|---|
| memory_order_hle_acquire | 0x10000 | 事务开始(相当于 XACQUIRE 前缀) |
| memory_order_hle_release | 0x20000 | 事务结束(相当于 XRELEASE 前缀) |
| 特性 | 规范参数 |
|---|---|
| 内存顺序基类型 | int32_t(与 C 标准兼容) |
| 修饰符基类型 | int64_t(预留扩展空间) |
| 顺序掩码 | 0x0000ffff(低 16 位) |
| 修饰符掩码 | 0xffff0000(高 16 位) |
| 修饰符位宽 | 16 位(支持最多 65536 种修饰符) |
|
strong |
内存顺序
定义原子操作的内存顺序语义,控制不同线程间的内存可见性顺序。
| 枚举值 | |
|---|---|
| relaxed | 最宽松的内存顺序,只保证原子性 |
| consume | 数据依赖顺序,用于依赖读取的场景 |
| acquire | 获取操作,确保后续读写不会被重排到前面 |
| release | 释放操作,确保前面的读写不会被重排到后面 |
| acq_rel | 获取-释放组合操作 |
| seq_cst | 顺序一致性,最严格的内存顺序 |
在文件 memory_order.hpp 第 129 行定义.
|
strong |
内存顺序修饰符枚举
用于扩展memory_order的功能,支持硬件锁消除(HLE)等高级特性。 // TODO: deprecated memory_order_modifier
| 枚举值 | |
|---|---|
| memory_order_mask | 内存顺序掩码 |
| memory_order_modifier_mask | 修饰符掩码 |
| memory_order_hle_acquire | HLE获取修饰符 |
| memory_order_hle_release | HLE释放修饰符 |
在文件 memory_order.hpp 第 159 行定义.
|
constexprnoexcept |
获取原子比较交换操作失败时的内存顺序
对于原子比较交换(compare-exchange)操作,成功和失败的内存顺序可以不同。 此函数根据给定的内存顺序,返回对应的失败内存顺序。
转换规则:
在文件 memory_order.hpp 第 203 行定义.
引用了 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().
|
constexprnoexcept |
检查比较交换失败内存顺序是否有效
| mo | 待检查的内存顺序 |
在文件 memory_order.hpp 第 220 行定义.
引用了 memory_order_acq_rel, memory_order_mask , 以及 memory_order_release.
被这些函数引用 atomic_cmpexch_strong(), atomic_cmpexch_strong_any(), atomic_cmpexch_weak(), atomic_cmpexch_weak_any(), atomic< T >::compare_exchange_strong(), atomic< T >::compare_exchange_strong(), atomic_base< T * >::compare_exchange_strong(), atomic_base< T * >::compare_exchange_strong(), atomic< T >::compare_exchange_weak(), atomic< T >::compare_exchange_weak(), atomic_base< T * >::compare_exchange_weak() , 以及 atomic_base< T * >::compare_exchange_weak().
|
constexprnoexcept |
内存顺序与修饰符的与操作符
| mo | 内存顺序 |
| mod | 内存顺序修饰符 |
在文件 memory_order.hpp 第 186 行定义.
引用了 mod().
|
constexprnoexcept |
内存顺序与修饰符的或操作符
| mo | 内存顺序 |
| mod | 内存顺序修饰符 |
在文件 memory_order.hpp 第 174 行定义.
引用了 mod().