Skip to content

第 6 章:并发

系列:程序员修炼之道 · 第 6/9 章


一句话总结

并发难在时序与共享状态;通过打破时域耦合、减少共享、用 Actor/黑板等模型,把不可预测性关进笼子。


核心观点浓缩

  • 打破时域耦合:分析工作流,识别可并行与必须顺序
  • 共享状态是不正确的状态:能不用锁就不用;不可变、消息传递
  • Actor / 进程:邮箱模型,状态私有化
  • 黑板系统:多专家协作解耦的共享结构
  • 随机故障:Heisenbug 需专门工具与可复现策略
  • 并发是设计问题,不是仅加线程

关键概念 / 金句

  • 「共享内存是错的」是警示,不是绝对禁令——但默认怀疑共享
  • 时域耦合:逻辑上不必同步的却写在一起

本章在全书中的位置

第 2 版新增重点章。桌面扫描软件中 UI 线程与工作线程边界,是日常并发主战场。


个人思考与启发

Qt:QThread + 信号槽队列连接,把耗时扫描放工作线程,UI 只收进度信号——打破 UI 与设备 IO 的时域耦合。
VTK 渲染常在 UI 线程 Render(),重计算勿在鼠标回调里阻塞。
共享状态:会话数据用明确所有者,避免多线程同时改 mesh 无锁。


与《软件设计的哲学》对照

  • 并发增加认知复杂度;模块边界清晰有助于界定哪段可并行
  • 消息传递类似深模块接口:只暴露邮箱,不暴露内部状态

重点与注意

重点:先分析工作流,再选线程模型。
重点:默认减少共享可变状态;优先不可变与消息。
重点:Heisenbug 要留日志、时间戳与可复现步骤。
注意:锁顺序一致,避免死锁;能用高层抽象(Qt 并发)别手写 pthread。
注意:「多线程更快」常不成立——测量后再并行。


导航:上一篇:第 5 章 · 下一篇:第 7 章 当你编码时

基于 VitePress 强力驱动 | 记录技术与生活