C++面试题更新 2026-08-05

在 C++ 中,内存序(memory order)有哪 6 种?请逐一说明它们的含义和适用场景。

技术原理C++

考察说明

考查对 C++ 内存模型及原子操作内存序的理解。

回答思路

  1. 【回答框架 1】C++ 内存序定义在 <atomic> 中,用于控制原子操作对内存的可见性和顺序约束,共 6 种:memory_order_relaxed、memory_order_consume、memory_order_acquire、memory_order_release、memory_order_acq_rel、memory_order_seq_cst。
  2. 【回答框架 2】memory_order_relaxed 只保证原子性,不提供顺序约束,适用于计数器等无依赖场景。memory_order_consume 用于依赖链,但实践中常被 acquire 替代,因为编译器难以精确跟踪依赖。
  3. 【回答框架 3】memory_order_acquire 用于读操作,保证后续读写不会被重排到该操作之前;memory_order_release 用于写操作,保证之前的读写不会被重排到该操作之后,两者常配对实现同步。
  4. 【回答框架 4】memory_order_acq_rel 结合 acquire 和 release,用于读改写操作(如 fetch_add),既获取又释放。memory_order_seq_cst 是默认且最强的顺序,提供全局一致的全序,所有线程看到相同操作顺序,但性能开销最大。
  5. 【回答框架 5】选择内存序需权衡正确性和性能:默认用 seq_cst 保证正确,性能敏感时用 acquire/release 或 relaxed,但必须确保同步关系正确。
  6. 【关键点 1】6 种内存序:relaxed、consume、acquire、release、acq_rel、seq_cst。
  7. 【关键点 2】relaxed 仅保证原子性,无顺序约束。
  8. 【关键点 3】acquire/release 配对实现同步,防止重排。
  9. 【关键点 4】seq_cst 提供全局全序,最安全但开销最大。
  10. 【关键点 5】consume 实际使用少,常被 acquire 替代。
  11. 【易错点 1】误以为 relaxed 能保证顺序,实际只保证原子性。
  12. 【易错点 2】将 acquire/release 用于非配对操作,导致同步失效。
  13. 【易错点 3】过度使用 seq_cst 导致性能下降,但正确性优先。