# Principles of Concurrent and Distributed Programming (Second Edition) - Errata

• P. 27, line -11. temp <- n + 1 should be temp <- n. (Thanks to Michael Förster).
• P. 41, exercise 6(b), "if C ... were replaced by D" should be "if D ... were replaced by C".
• p. 75, line -1. "A U B is true is a state" should be "A U B is true in a state".
• p. 76, line -11. "A circle B is true is a state" should be "A circle B is true in a state".
• p. 81, lines 10-11. Delete the second formula, which is true not false as claimed. (Thanks to Joonas Harjumäki.)
• p. 82, line 3: "out of its critical section" should be "out of its non-critical section". (Thanks to Dan Tecu.)
• p. 90, line -12: "terminate in its critical section" should be "terminate in its non-critical section". (Thanks to Dan Tecu.)
• p. 90. p6 in formula (4.5) should be p4..6, and similarly q6 in formula (4.6) should be q4..6.
• p. 91, exercise 9: "if A is true sj" should be "if A is true in state sj". (Thanks to Bob Hilderman.)
• p. 92. The modification described in exercise 14 was later applied to the text, so the exercise is no longer relevant.
• p. 130. Following line p5 of Udding's algorithm, add the statement numGate1 \leftarrow numGate1 - 1.
• p. 139, ex. 8. #Buffer should be #buffer.
• p. 140, ex. 9. A circular buffer can be synchronized by making its length one larger than the number of elements it is to store. In that case, in=out indicates an empty buffer, while a full buffer is indicated by in being one less than out modulo the size of the buffer. When the semaphores are used, this convention is not necessary. The algorithm itself will work, but the declaration should be changed to datatype array[0..N-1] buffer so that the modulo N will work. (Thanks to Jan Lönnberg.)
• p. 149, line 3: cond should be nonZero. (Thanks to Bob Hilderman.)
• p. 159, line -2. "If a reader is starved is must" should be "If a reader is starved it must".
• p. 160, line -2. The invariant should be eating[i] -> (forks[i]=2). Clearly, forks[i]=2 is true initially, but eating[i] is false.
• p. 242, Theorem 11.2: "the source node eventually announces termination" should be "the environment node eventually announces termination". (Thanks to Bob Hilderman.)
• p. 247, lines 9-13: Clarification: these lines replace lines p8 through p11 of the algorithm on p. 244 and not the entire algorithm for send signal. The modification suggested at the bottom of the page makes it possible for the system to terminate without doing anything. If this scenario should not be allowed, the definition of isTerminated should be changed. (Thanks to Chris Middlemiss.)
• p. 334, line p3 in the algorithm. "wait for all process" should be "wait for all processes".

The following issues relate to the "Answers to Exercises" that is available to instructors through the Pearson website.

• There is a problem with the scenario given for Exercise 3.6. The last few lines should be:
``` 8.   p4   q3   -1   0
9.   p5   q3   -1   0
10.   p5   q4   -1  -1
11.   p5   q5   -1  -1
```

(Thanks to Bob Hilderman.)

• In the answer to Exercise 4.2, "values 0 and 1" should be "values 1 and 2". (Thanks to Bob Hilderman.)
• The answer to Exercise 6.3 is incorrect. I won't give the correct answer here, but I'm sure you can figure it out. (Thanks to Jan Lönnberg.)
• In the answer to Exercise 7.4c, remove the "mod 2" in the 7th line of the code. (Thanks to Jan Lönnberg.)

Last update 28 October 2013.