*** p. 13, third line from bottom -- the definition of independent operations is wrong; it should read "Two operations are independent if the write set of each is disjoint from both the read and write sets of the other."
p. 30, lines 6-8 of text -- A process declaration does not end
with the keyword end; the body is enclosed in braces.
Thus replace the sentences starting with
"It begins with the keyword" by the following:
"It begins with the keyword process.
The body of a process is enclosed in braces; it contains
declarations of local variables, if any, and a list of statements."
p. 40, line 2 -- change "@await@" to "await"
*** p. 45, definition (2.1), Independence of Parallel Processes, is wrong -- change the last sentence to: "Two parts of a program are independent if the write set of each part is disjoint from both the read and write sets of the other part."
p. 105, 5th line from bottom -- change "(2.4)" to "(2.2)"
*** pp. 106-8, Figures 3.5, 3.6, and 3.7 -- there is a terrible mistake in the entry protocols for the various versions of the tie-breaker algorithm. In particular, the "in" flags need to be set before last is changed. As a specific example, line 5 of Figure 3.5 should read
in1 = true; last = 1; /* entry protocol */The same kind of change needs to be made in line 14 of Figure 3.5, lines 5 and 14 in Figure 3.6, and line 6 in Figure 3.7. (Somehow I reversed the orders of these pairs of assignments when rewriting this section from my Concurrent Programming book.)
*** p. 109, fourth line from bottom -- change "likely" to "unlikely"
p. 115, line 4 of second program display -- indent "wait" so that it lines up with "code"
p. 142, line 7 of exercise 3.2 -- change "variable" to "var"
p. 145, line 5 -- change "module 3" to "modulo 3"
p. 187, first four lines of Figure 4.15 -- delete the space after #
p. 248, first five lines of Figure 5.18 -- delete the space after #
p. 273, Figure 6.3 -- there is a missing right brace at the end of the figure
*** p. 275, procedure join -- add the statement "executing[i] = 0;"
p. 294, line 7 -- change "distributed share memory" to "distributed shared memory"
*** p. 317, Figure 7.13 -- processes P[2] through P[n-2] need to send the result along to the next process. Hence add the following statement after the last receive statement at the bottom of the figure:
if (i < n-1) send values[i+1](smallest, largest);
p. 338, first two lines of Figure 7.16 -- delete the space after #
p. 341, first line of Figure 7.17 -- delete the space after #
p. 367, line 10 -- change "delay and tick" to "delay and the Clock process"
p. 429, Figure 9.2 -- indent the line that begins "print the result" so that it is under the right brace is the previous line
p. 442, line 5 of paragraph 4 -- change "and row j of b" to "and column j of b"
p. 462, line 12 of Figure 9.16 -- indent "announce termination and halt;" it is the body of the if statement
p. 467, Figure 9.20 -- indent the lines "eat;" and "think'" so they line up with the call and send statements
p. 583, second paragraph of Historical Notes -- Forsythe and Moler [1967] served as the main source for Section 11.3, not Section 11.2
p. 594, lines 2-6 of Figure 12.1 -- delete the space after #
p. 596, first five lines of Figure 12.2 -- delete the space after #
p. 624, paragraph 3, line 6 -- delete all the white space between "assigned" and "all". (Who knows what happened here!)
p. 632, Figure 12-8 -- indent the line that begins "initialize grid" so that it lines up with do in the next line
*** p. 647, line 3 of At-Most-Once Property -- delete
"x is not written by another process and"
Last updated December 17, 2002