BOOK / SOURCE & READING RECORD
C++ Concurrency in Action
Anthony Williams
1st edition, 2012, ISBN 9781933988771; additionally inspected 2nd-edition public previews (2019)
C++ Concurrency in Action
完整阅读 2012 年第一版的第 1–10 章、附录 A–D(正文书页 1–486);另读第二版未登录预览的第 1、2 章可见部分,第二版不声称读完。第一版公开 PDF 的网页转换在书页 194 中断,改用私有本地文本继续读至附录 D 结尾;目录和索引不计正文。历史 API 与示例并非 C++20 规范,本文不照搬无锁容器实现。
查看版本、实际阅读范围与原文入口 →Sources
- Manning 第一版出版社页面
2012 年第一版;全书阅读来源为私有证据记录中的公开副本,非出版社免费授权全文。
- Manning 第二版公开预览第 2 章
第二版可见预览 2.1–2.5 和小结,部分段落截短,不计第二版完整覆盖。
同步证明比时间猜测可靠
第一版第 2 章 2.1–2.3;第 4 章 4.1;第 5 章 5.2–5.3;第 7 章 7.2;第 10 章 10.2
线程是否结束、状态是否可读、对象是否还活着,是三个不同问题。第一版从线程所有权写到共享状态、条件变量和内存序,提供的共同视角是寻找一条可解释的先后关系,而不是相信机器足够慢或等待足够久。通知本身不保存业务事实,互斥量保护的谓词才保存事实;同样,原子计数的每次更新不可分割,并不自动让多字段协议成立。阅读无锁章节还必须把节点回收与指针更新分别证明,不能以一次成功的比较交换代替对象寿命分析。用于今天的工程时,我优先保留易审查的锁和明确生命周期;只有测量证明瓶颈存在,再讨论拆锁或降低内存序。C++20 的 jthread 缩短了回收线程的样板代码,却没有替我们设计关闭协议。
相关基础课
线程生命周期:thread、jthread 与 stop_token条件变量:谓词、丢失通知与虚假唤醒内存序:relaxed、acquire-release 与 happens-before