⚡
并发编程
6 篇文章
查看专题概览 / 复习建议
核心问题
- 锁、条件变量、原子变量分别解决什么问题
- 为什么会有竞争条件、死锁、虚假唤醒
- 内存序存在的意义是什么
- 线程池为什么是高频设计题
- 并发编程中的异常安全问题
- 无锁编程的适用场景和限制
- 线程局部存储的使用
- 并发性能优化策略
建议复习顺序
- 线程与共享状态(互斥锁与条件变量)
- 线程生命周期管理(join / detach)
- 互斥和条件同步(锁的使用模式)
- 原子与内存模型(原子变量与内存序)
- 异步结果传递(future / promise / async)
- 线程池与工程实践(并发设计模式)
子主题导航
- 互斥锁与条件变量.md
- 原子变量与内存序.md
- 线程池设计.md
- [thread生命周期与join detach.md](thread生命周期与join detach.md)
- [future promise与async.md](future promise与async.md)
- 死锁与锁顺序.md
高频追问
- 条件变量为什么要搭配谓词
- 原子就一定比锁快吗
- 什么是 happens-before
- 为什么
std::thread析构时不自动 join future、promise、packaged_task的关系是什么- 线程池退出时要不要清空剩余任务
- 如何避免死锁
- 虚假唤醒的原因和处理
- 内存序的性能影响
易错点
- 认为原子可以替代所有锁
- 认为
notify_one会记住通知 - 只讲线程池结构,不讲退出和异常处理
- 忽略线程对象本身的生命周期管理
- 忽略虚假唤醒的处理
- 不理解内存序的实际意义
- 在锁内执行耗时操作
学习策略
记忆技巧
并发编程三层次:
- 互斥锁 = “一次一个人访问共享数据”
- 条件变量 = “什么时候该醒来工作”
- 原子变量 = “不可分割的操作”
内存序口诀:
- relaxed = “只保证原子性”
- acquire/release = “构建同步关系”
- seq_cst = “全局一致顺序”
关联学习
并发编程与前面的知识紧密相关:
- 内存管理:线程安全的资源管理
- 对象模型:原子操作、内存序
- RAII:锁的自动释放(lock_guard)
- 移动语义:任务提交、future传递
并发编程需要理解底层硬件、操作系统和语言特性的交互。