Additional Corrections for First Printing

If you have the first printing of Foundations of Multithreaded, Parallel, and Distributed Programming, your copy contains the following additional mistakes. (All of these were corrected in the second printing.) The most significant corrections are flagged with three asterisks.


*** 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