从 0 开始讲透 C++ 并发(五):atomic(无锁并发彻底讲透)
一、问题锁一定是最优解吗前面我们已经掌握mutex lock_guard / unique_lock → 线程安全 但问题是加锁有成本 ❗❌ 锁的缺点✔ 上下文切换线程阻塞 ✔ 性能开销大 ✔ 可能死锁 所以我们会想有没有不加锁也能安全的方式二、解决方案atomic原子操作一句话定义atomic 保证对变量的操作是“不可分割的”原子性示例std::atomicint a 0; a; // 线程安全 ✔对比int a 0; a; // 非线程安全 ❌因为 a 不是一步操作实际是1. 读 a2. 加 13. 写回 多线程下会乱线程1读 0线程2读 0线程1写 1线程2写 1结果丢数据 ❗atomic 会保证整个操作不可被打断 ✔三、最常见用法1️⃣ 自增std::atomicint count 0; count;2️⃣ load / storecount.store(10); int v count.load();3️⃣ compare_exchangeCASint expected 0; count.compare_exchange_strong(expected, 1); 含义如果 count expected→ 修改为 1否则失败 这就是CAS无锁核心机制四、atomic vs mutex必须会维度atomicmutex是否加锁❌✔性能高较低复杂逻辑❌✔使用场景简单变量复杂操作总结atomic → 简单 高性能mutex → 通用 安全五、使用场景✔ 适合 atomic✔ 计数器✔ 状态标志true/false✔ 统计数据❌ 不适合❌ 复杂结构vector / map❌ 多步逻辑❌ 需要事务一致性六、Java 对比JavaAtomicInteger count new AtomicInteger(0); count.incrementAndGet();Cstd::atomicint count(0); count;对比AtomicInteger ≈ std::atomic七、核心理解 并发问题分两类1️⃣ 数据竞争 → 用 mutex / atomic2️⃣ 线程协作 → 用 condition_variable 进一步细分简单变量 → atomic复杂逻辑 → mutex八、笔记版atomic 作用 保证变量操作原子性无锁 特点 ✔ 高性能 ✔ 不阻塞 ✔ 无锁 适用 ✔ 计数器 ✔ 状态变量 不适用 ❌ 复杂逻辑 对比 atomic → 简单高效 mutex → 通用安全 一句话 atomic 用来“无锁保证安全”九、一句话总结atomic 是用硬件级原子操作实现线程安全的轻量级方案用于替代简单场景下的锁CAS 也是有值对比重试也是占用cpu的。到底怎么理解呢tips从 0 开始讲透 C 并发五·进阶终版CAS vs mutex无锁与加锁的本质区别十、你现在的并发体系已经成型你已经打通thread → 执行mutex → 保护cv → 协作atomic → 优化 这就是C 并发核心四件套下一篇第6篇线程池任务系统骨架 这一篇会把你所有知识串起来thread mutex cv atomic总结mutex 保证正确性atomic 提供性能优化cv 负责线程协作