C++内存序
什么是内存序内存序Memory Order是 C11 引入的概念用于控制多线程环境下对共享变量的读写操作顺序。它主要与 std::atomic 配合使用。为什么需要内存序在多核处理器和编译器优化的环境下程序的实际执行顺序可能与代码顺序不一致1.编译器优化 - 编译器可能重新排序指令2.CPU 乱序执行 - 处理器可能不按程序顺序执行指令3.缓存同步延迟 - 不同核心的缓存同步时机不确定std::atomic 的内存序Memory Order相关操作主要分为加载load、**存储store和读-修改-写read-modify-write**三类。1.加载操作 (Load)T load(std::memory_order order std::memory_order_seq_cst) const noexceptT operator T() const noexcept - 隐式转换默认使用 seq_cst存储操作 (Store)void store(T desired, std::memory_order order std::memory_order_seq_cst) noexceptT operator(T desired) noexcept - 赋值操作默认使用 seq_cst3.读-修改-写操作 (RMW)T exchange(T desired, std::memory_order order std::memory_order_seq_cst) noexcept - 交换bool compare_exchange_weak(T expected, T desired, std::memory_order order std::memory_order_seq_cst) noexcept - 弱比较交换bool compare_exchange_strong(T expected, T desired, std::memory_order order std::memory_order_seq_cst) noexcept - 强比较交换bool compare_exchange_weak(T expected, T desired, std::memory_order success, std::memory_order failure) noexceptbool compare_exchange_strong(T expected, T desired, std::memory_order success, std::memory_order failure) noexcept4.算术/位操作 (仅限整型和指针)T fetch_add(T operand, std::memory_order order std::memory_order_seq_cst) noexceptT fetch_sub(T operand, std::memory_order order std::memory_order_seq_cst) noexceptT fetch_and(T operand, std::memory_order order std::memory_order_seq_cst) noexceptT fetch_or(T operand, std::memory_order order std::memory_order_seq_cst) noexceptT fetch_xor(T operand, std::memory_order order std::memory_order_seq_cst) noexceptT operator(int) noexcept - 后置T operator() noexcept - 前置T operator–(int) noexcept - 后置–T operator–() noexcept - 前置–5.指针特化操作T fetch_add(std::ptrdiff_t operand, std::memory_order order std::memory_order_seq_cst) noexceptT fetch_sub(std::ptrdiff_t operand, std::memory_order order std::memory_order_seq_cst) noexceptT operator(std::ptrdiff_t operand) noexceptT operator-(std::ptrdiff_t operand) noexcept内存序类型┌──────────────────────┬──────────────────────┬──────────────────────────────────────────────────────────────────┐ │ 内存序 │ 含义 │ 保证 │ ├──────────────────────┼──────────────────────┼──────────────────────────────────────────────────────────────────┤ │ memory_order_relaxed │ 无同步仅保证原子性 │ 只保证单个原子操作的原子性 │ ├──────────────────────┼──────────────────────┼──────────────────────────────────────────────────────────────────┤ │ memory_order_acquire │ 获取操作 │ 此后的读写不会被重排序到此操作之前 │ ├──────────────────────┼──────────────────────┼──────────────────────────────────────────────────────────────────┤ │ memory_order_release │ 释放操作 │ 此前的读写不会被重排序到此操作之后 │ ├──────────────────────┼──────────────────────┼──────────────────────────────────────────────────────────────────┤ │ memory_order_acq_rel │ acquire release │ 结合两者的保证用于RMW操作 │ ├──────────────────────┼──────────────────────┼──────────────────────────────────────────────────────────────────┤ │ memory_order_seq_cst │ 顺序一致性 │ 默认提供全局统一的操作顺序 │ ├──────────────────────┼──────────────────────┼──────────────────────────────────────────────────────────────────┤ │ memory_orderconsume │ 消费操作 │ 类似acquire但只保证依赖链上的内存访问不重排序C20起已弃用 │ └──────────────────────┴──────────────────────┴──────────────────────────────────────────────────────────────────┘data.store() 通常用于发布-订阅或标志位设置场景常配合 memory_order_release 使用。