并发编程

6 篇文章

查看专题概览 / 复习建议

核心问题

  • 锁、条件变量、原子变量分别解决什么问题
  • 为什么会有竞争条件、死锁、虚假唤醒
  • 内存序存在的意义是什么
  • 线程池为什么是高频设计题
  • 并发编程中的异常安全问题
  • 无锁编程的适用场景和限制
  • 线程局部存储的使用
  • 并发性能优化策略

建议复习顺序

  1. 线程与共享状态(互斥锁与条件变量)
  2. 线程生命周期管理(join / detach)
  3. 互斥和条件同步(锁的使用模式)
  4. 原子与内存模型(原子变量与内存序)
  5. 异步结果传递(future / promise / async)
  6. 线程池与工程实践(并发设计模式)

子主题导航

高频追问

  • 条件变量为什么要搭配谓词
  • 原子就一定比锁快吗
  • 什么是 happens-before
  • 为什么 std::thread 析构时不自动 join
  • futurepromisepackaged_task 的关系是什么
  • 线程池退出时要不要清空剩余任务
  • 如何避免死锁
  • 虚假唤醒的原因和处理
  • 内存序的性能影响

易错点

  • 认为原子可以替代所有锁
  • 认为 notify_one 会记住通知
  • 只讲线程池结构,不讲退出和异常处理
  • 忽略线程对象本身的生命周期管理
  • 忽略虚假唤醒的处理
  • 不理解内存序的实际意义
  • 在锁内执行耗时操作

学习策略

记忆技巧

并发编程三层次

  • 互斥锁 = “一次一个人访问共享数据”
  • 条件变量 = “什么时候该醒来工作”
  • 原子变量 = “不可分割的操作”

内存序口诀

  • relaxed = “只保证原子性”
  • acquire/release = “构建同步关系”
  • seq_cst = “全局一致顺序”

关联学习

并发编程与前面的知识紧密相关:

  1. 内存管理:线程安全的资源管理
  2. 对象模型:原子操作、内存序
  3. RAII:锁的自动释放(lock_guard)
  4. 移动语义:任务提交、future传递

并发编程需要理解底层硬件、操作系统和语言特性的交互。