
目录1六大内存序2原子操作2.1原子操作的核心操作基础操作store 和 load3利用内存模型和原子操作的生产者消费者模型设计1六大内存序内存顺序类型核心特点memory_order_relaxed宽松无同步只保证原子性不保证顺序。不引入同步屏障允许编译器和 CPU 任意重排memory_order_consume消费已过时依赖当前原子变量的后续操作不被重排到它之前。不推荐使用编译器通常降级为 acquirememory_order_acquire获取读屏障该原子读操作之后的所有读写操作都不能重排到该操作之前。memory_order_release释放写屏障该原子写操作之前的所有读写操作都不能重排到该操作之后memory_order_acq_rel获取-释放读写屏障同时具备 acquire 和 release 效果用于 Read-Modify-Write 操作如 exchange。memory_order_seq_cst顺序一致性最强全局所有线程看到统一的修改顺序最强最直观但性能开销最大。1memory_order_release 释放----写屏障 可以理解为原子操作的时候进行写操作在写完释放给别的线程读之前必须把此线程在自身缓冲区写的数据全部同步到 公共的缓存中“线程在执行 Release 写操作时必须确保本线程在 Release 之前发生的所有写操作都已经对其它核心可见即排空到共享缓存然后才允许执行 Release 这个写操作本身。”2memory_order_acquire 获取----读屏障 可以理解为必须先将公共区的数据都读完之后在进行其他的操作比如写操作。2原子操作原子操作Atomic Operation是指不可被中断的一个或一系列操作。在多线程环境中原子操作要么全部执行完成要么完全不执行不会出现执行到一半被其他线程干扰的情况。2.1原子操作的核心操作基础操作store 和 load操作函数原型允许的内存顺序写入void store(T desired, memory_order order seq_cst)relaxed, release, seq_cst读取T load(memory_order order seq_cst) constrelaxed, acquire, seq_cststd::atomicintvalue{0};// store 操作value.store(42);// 默认 seq_cstvalue.store(100,std::memory_order_release);// 显式指定 releasevalue.store(1,std::memory_order_relaxed);// 最弱的顺序// load 操作int xvalue.load();// 默认 seq_cstint yvalue.load(std::memory_order_acquire);// 显式指定 acquireint zvalue.load(std::memory_order_relaxed);// 最弱的顺序store 不能使用 memory_order_acquire 或 memory_order_acq_relload 不能使用 memory_order_release 或 memory_order_acq_rel操作函数原型说明交换T exchange(T desired, memory_order order seq_cst)用新值替换旧值返回旧值CAS弱bool compare_exchange_weak(T expected, T desired, …)可能虚假失败适合循环CAS强bool compare_exchange_strong(T expected, T desired, …)不会虚假失败算术T fetch_add(T arg, memory_order order seq_cst)加、减、与、或、异或std::atomicintcounter{10};// exchange交换并返回旧值int oldcounter.exchange(20);// old 10, counter 20// fetch_add原子加int previouscounter.fetch_add(5);// previous 20, counter 25// compare_exchangeCASCompare-And-Swapint expected25;if(counter.compare_exchange_strong(expected,100)){// 如果 counter 当前是 25替换为 100expected 不变std::cout替换成功counter 100std::endl;}else{// 替换失败expected 被更新为 counter 的实际值std::cout替换失败当前值为expectedstd::endl;}特性compare_exchange_weakcompare_exchange_strong虚假失败✅ 可能即使相等也返回 false❌ 不会相等一定返回 true性能更快某些平台可用 LL/SC 优化稍慢需要重试处理典型用法循环中while weak单次检查返回值bool成功/失败bool成功/失败// ✅ weak 的正确用法在循环中重试std::atomicintvalue{0};int expected0;while(!value.compare_exchange_weak(expected,100,std::memory_order_acq_rel)){// 失败时 expected 被更新为实际值// 这里可以加一个最大重试次数限制}// ✅ strong 的典型用法单次检查int expected0;if(value.compare_exchange_strong(expected,100,std::memory_order_acq_rel)){// 成功处理}3利用内存模型和原子操作的生产者消费者模型设计#includeiostream#includethread#includeatomicstd::atomicintcount{0};// 共享整形变量初始为 0绝对主角std::atomicboolready{false};// 同步标志true有货待消费false已消费// 生产者count 不断加一 voidproducer(){for(int i1;i10;i){// ① 直接修改 count加一操作// 使用 release保证这次写入完成之前之前的所有操作都已完成count.store(i,std::memory_order_release);// ② 通知消费者count 已经更新快来打印// 必须用 release保证 count 的写入在通知之前可见ready.store(true,std::memory_order_release);// ③ 等待消费者打印完成等待 ready 被改回 falsewhile(ready.load(std::memory_order_acquire)){// 自旋等待CPU 会忙等}}}// 消费者打印 count 的当前值 voidconsumer(){for(int i1;i10;i){// ① 等待生产者通知等待 ready 变成 truewhile(!ready.load(std::memory_order_acquire)){// 自旋等待}// ② 读取 count 的最新值并打印// 用 acquire 保证读到的 count 一定是生产者 release 写进去的最新值int valuecount.load(std::memory_order_acquire);std::cout消费者打印: count valuestd::endl;// ③ 告诉生产者我已经打印完了你可以生产下一个了// 用 release 保证“打印完成”这个动作在改 ready 之前完成ready.store(false,std::memory_order_release);}}intmain(){std::threadt1(producer);std::threadt2(consumer);t1.join();t2.join();return0;}