Paul E. McKenney — the Linux kernel developer who authored the RCU (Read-Copy-Update) synchronization mechanism — maintains a free online textbook titled "Is Parallel Programming Hard, And, If So, What Can You Do About It?" The current version is v2026.06.21a, available in double-column, single-column, and ebook PDF formats under a Creative Commons Attribution-Share Alike 3.0 United States license, with a git tree at kernel.org for patches and updates.

A reviewer at ahelwer.ca, whose professional work had centered on TLA⁺ and distributed systems for a decade, read the textbook during a Canadian family vacation and wrote a candid assessment. They entered the book hoping to transition from formal-methods work to concurrent programming, spurred by a talk at the 2026 Software Should Work conference about the difficulty of writing a concurrent lock-free garbage collector.

The reviewer found the opening chapters well-paced: Chapter 3, "Hardware and its Habits," walks through CPU cache behavior including a simplified account of a core writing to a cache-missing address. But they flag a gap: the MESI cache-coherence protocol appears only in the appendix, yet understanding it transformed the rest of the book for them — including the realization that on x86, two cores cannot literally write the same cache line simultaneously, because exclusive ownership must transfer between cores.

Chapter 4, "Tools of the Trade," covers what the reviewer calls "double trouble": compiler optimizations that break parallel code (load tearing, store tearing, invented loads and stores, dead-code elimination) and CPU execution reordering on top of that. The reviewer notes the chapter is Linux-kernel-centric and gives short shrift to the C++11/C11 memory-model work (std::memory_order, ACCESS_ONCE, WRITE_ONCE macros), which they had to seek elsewhere.

Chapter 5, "Counting," is the reviewer's highlight. It compares roughly ten approaches to having multiple threads increment a shared counter, dispatching the obvious atomic-increment version early on performance grounds. The chapter introduces per-thread statistical counters (related to conflict-free replicated datatypes) as a way to avoid false sharing, and culminates in a "signal-theft limit counter" the reviewer admits they did not fully grasp.

Overall, the reviewer calls the textbook excellent — not because it is easy, but because it created a "thirst" to learn more: release-consume ordering, out-of-thin-air values, the DEC Alpha's weak memory model, deterministic simulation testing of lock-free algorithms, and preemptible atomics on pre-v8 ARM. They plan to study high-performance garbage collection next.