基础能力系列 - 多线程1 - 内存序

发布时间:2026/5/25 1:35:25

基础能力系列 - 多线程1 - 内存序 C11 定义了 6 种原子操作的内存序memory order用于控制多线程中的可见性和重排序规则。如下是六种内存序的简介、特点和适用场景六种内存序一览表内存序名称描述 / 特点是否同步其他线程可见性是否禁止重排序使用场景示例memory_order_relaxed最弱序无同步无重排序限制不同步其他线程允许重排序统计计数器、自增编号等memory_order_consume数据依赖同步已废弃实际等同 acquire编译器优化误差多几乎不用memory_order_acquire获取操作防止之后操作被重排序到前面同步前写可见禁止之后操作重排序load时读取同步数据memory_order_release释放操作防止之前操作被重排序到后面同步后读可见禁止之前操作重排序store时写入同步数据memory_order_acq_rel同时具有 acquire 和 release 效果双向同步全部禁止重排序常用于fetch_add等读改写操作memory_order_seq_cst最强序全局顺序一致性所有线程可见强制全局顺序多线程安全易理解但性能最低实用说明memory_order_relaxed不做任何同步仅保证原子性。不保证其他线程看到值变化的顺序。std::atomicintx(0);x.store(1,std::memory_order_relaxed);// 线程B可能看不到memory_order_acquire常用于load操作。保证本线程对该变量之后的操作不会被提到它前面。intdata0;std::atomicboolreadyfalse;// 线程Adata42;ready.store(true,std::memory_order_release);// 线程Bwhile(!ready.load(std::memory_order_acquire));std::coutdata;// 始终能看到 data 42memory_order_release常用于store操作。保证本线程在此之前的写入对其他 acquire 线程可见。memory_order_acq_rel用于读-改-写原子操作如fetch_add、compare_exchange保证在操作前后都不能乱序counter.fetch_add(1,std::memory_order_acq_rel);memory_order_seq_cst“Sequential Consistency”最直观的并发语义保证所有线程看到的修改具有全局一致顺序对于简单并发程序是最安全选择但性能可能不理想memory_order_consume理论上只依赖“数据依赖性”但已在实践中废弃比如 gcc/clang 实际当作 acquire 处理小结Relaxed Acquire/Release Acq_Rel Seq_Cst (低同步/快) → (高同步/慢)往期精彩回顾:基础能力系列区块链知识系列密码学系列零知识证明系列共识系列公链调研系列BTC系列以太坊系列EOS系列Filecoin系列联盟链系列Fabric系列智能合约系列Token系列

相关新闻