Paul E. McKenney —— Linux 内核开发者,也是 RCU(Read-Copy-Update)同步机制的作者 —— 维护着一份免费在线教科书,书名为《Is Parallel Programming Hard, And, If So, What Can You Do About It?》。当前版本为 v2026.06.21a,以双栏、单栏和电子书 PDF 格式提供,采用 Creative Commons Attribution-Share Alike 3.0 United States 许可协议,kernel.org 上还有一个 git 仓库用于接收补丁与更新。
一位来自 ahelwer.ca 的评测者,其专业工作以 TLA⁺ 和分布式系统为中心长达十年之久,在一次加拿大家庭度假期间阅读了这本教科书,并撰写了一篇坦诚的评测。他们阅读本书的初衷,是从形式化方法工作转向并发编程,起因是 2026 年 Software Should Work 会议上一场关于编写无锁并发垃圾回收器难度的演讲。
评测者认为开篇章节节奏良好:第三章《硬件及其习性》(Hardware and its Habits)讲解了 CPU 缓存行为,包括对一个核心向缓存缺失地址写入的简化说明。但他们指出一个缺口:MESI 缓存一致性协议只出现在附录中,而理解该协议却改变了他们对后续章节的阅读体验 —— 包括意识到在 x86 架构上,两个核心无法真正同时写入同一条缓存行,因为独占所有权必须在核心之间传递。
第四章《行业工具》(Tools of the Trade)涵盖了评测者所称的“双重麻烦”:破坏并行代码的编译器优化(加载撕裂、存储撕裂、凭空产生的加载与存储、死代码消除),以及在此之上的 CPU 执行重排。评测者指出该章以 Linux 内核为中心,对 C++11/C11 内存模型工作(std::memory_order、ACCESS_ONCE、WRITE_ONCE 宏)着墨甚少,他们不得不另行查阅相关资料。
第五章《计数》(Counting)是评测者最欣赏的章节。它比较了大约十种让多个线程递增共享计数器的方法,并以性能为由早早否决了显而易见的原子递增版本。该章引入了每线程统计计数器(与无冲突可复制数据类型相关)以避免伪共享,并最终推出一种“信号窃取极限计数器”(signal-theft limit counter),评测者坦承自己并未完全理解。
总体而言,评测者认为这本教科书非常出色 —— 并非因为它简单,而是因为它激发了进一步学习的渴望:释放-消费排序(release-consume ordering)、凭空值(out-of-thin-air values)、DEC Alpha 的弱内存模型、无锁算法的确定性模拟测试,以及 pre-v8 ARM 上的可抢占原子操作。他们计划接下来研究高性能垃圾回收。
