第 6 章:并发
系列:程序员修炼之道 · 第 6/9 章
一句话总结
并发难在时序与共享状态;通过打破时域耦合、减少共享、用 Actor/黑板等模型,把不可预测性关进笼子。
核心观点浓缩
- 打破时域耦合:分析工作流,识别可并行与必须顺序
- 共享状态是不正确的状态:能不用锁就不用;不可变、消息传递
- Actor / 进程:邮箱模型,状态私有化
- 黑板系统:多专家协作解耦的共享结构
- 随机故障:Heisenbug 需专门工具与可复现策略
- 并发是设计问题,不是仅加线程
关键概念 / 金句
- 「共享内存是错的」是警示,不是绝对禁令——但默认怀疑共享
- 时域耦合:逻辑上不必同步的却写在一起
本章在全书中的位置
第 2 版新增重点章。桌面扫描软件中 UI 线程与工作线程边界,是日常并发主战场。
个人思考与启发
Qt:QThread + 信号槽队列连接,把耗时扫描放工作线程,UI 只收进度信号——打破 UI 与设备 IO 的时域耦合。
VTK 渲染常在 UI 线程 Render(),重计算勿在鼠标回调里阻塞。
共享状态:会话数据用明确所有者,避免多线程同时改 mesh 无锁。
与《软件设计的哲学》对照
- 并发增加认知复杂度;模块边界清晰有助于界定哪段可并行
- 消息传递类似深模块接口:只暴露邮箱,不暴露内部状态
重点与注意
重点:先分析工作流,再选线程模型。
重点:默认减少共享可变状态;优先不可变与消息。
重点:Heisenbug 要留日志、时间戳与可复现步骤。
注意:锁顺序一致,避免死锁;能用高层抽象(Qt 并发)别手写 pthread。
注意:「多线程更快」常不成立——测量后再并行。
导航:上一篇:第 5 章 · 下一篇:第 7 章 当你编码时