This page contains a list of all known errors in the book,
listed in reverse chronological order of discovery.
Depending on when you obtained your copy, you may see all, some, or
none of these bugs.
If you want to correct your copy, work down the list until one of the
bugs is missing; at that point you’ve fixed them all.
Page numbers are from the PDF and print versions of the book.
If you’re using the epub version you may need to extrapolate.
To report additional bugs, send mail to
and
.
-
p. 28, last line of page, replace “impliesthat” with
“implies that”.
-
p. 68, Fig. 4.7, replace first line of lock.release with
“int t := now_serving.load(||) + 1”.
-
p. 120, third line of first full paragraph: replace
“2009 (Secs. 8.6, 12.2.4, and 12.3.4)” with
“2016 (Secs. 9.5, 13.2.4, and 13.3.4)”.
-
p. 6, footnote 1: replace “on” with “in”.
-
p. 35, line 5: replace “the box on Chapter 1” with
“the ‘Distribution’ box near the beginning of Chapter
1”.
-
p. 46, second line of second paragraph of Section 3.2: replace
“page 8” with “page 7”.
-
p. 64, first line of third paragraph of box: replace
“Sec. 2.1.2” with “box in Sec. 2.1.2”.
-
p. 110, last line of second full paragraph: replace “page 140”
with “page 141”.
-
p. 179, line 5: replace question mark with “Singh et al. (2021)”.
-
p. 193: first line of second paragraph of box: replace “page 196”
with “page 192”.
-
Right arrow characters are missing in several figures:
-
p. 42, Fig. 3.1 should appear as
thread 1: |
thread 2: |
|
// insert(C) |
|
// delete(D) |
| read n→v // A
|
| read n→v // A |
| p := n | | p := n |
| n := n→next | |
n := n→next | |
| read n→v // D |
| read n→v // D |
| m := new node(C) | |
t := n→next |
| m→next := n |
| p→next := m |
| | | p→next := t |
-
p. 141, Fig. 8.2: second-to-last line on the left should read
“n→next→store(o, ||)”;
third-to-last line on the right should read
“n := o→next→load(||)”.
-
p. 148, Fig. 8.8: 5th line of queue.enqueue should read
“n := t.p→next.load()”;
8th line of queue.enqueue should read
“if t.p→next.CAS(n, ⟨w,
n.c+1⟩)”;
5th line of queue.dequeue should read
“n := h.p→next.load()”;
13th line of queue.dequeue should read
“rtn := n.p→val.load()”.
-
p. 76, Fig. 4.14:
- replace first two lines with the single line “qnode*
thread_qnode_ptrs[T] := {i ∈ T:
new qnode(false)}”.
- first line of declaration of class lock
should read “atomic<qnode*> tail := new
qnode(false)”.
Thanks to Elad Lahav for their help in catching these mistakes.