resource race_2_processes() var N : int := 10; getarg(1, N) var sum: int := 0 write("race 2 processes, loop upper bound =", N) procedure fn(j, k: int) returns f: int f := j fa l := 1 to k -> f := f + l af end fn process Pr(j := 1 to 2) write("process", j) fa i := 1 to N -> sum := fn(sum, i) af write("age()=", age(), "process", j, "end, sum = ", sum) end Pr # correct race-free final value of sum is 2*220 = 440 for N of 10 # and 2*167167000 = 334334000 for N of 1000 end race_2_processes /* ............... Example compile and run(s) % sr -o race race.sr % ./race race 2 processes, loop upper bound = 10 process 1 age()= 41 process 1 end, sum = 220 process 2 age()= 47 process 2 end, sum = 440 % sr -c race.sr % srl -L 1 -o race_L1 race_2_processes % ./race_L1 race 2 processes, loop upper bound = 10 process 1 process 2 age()= 42 process 1 end, sum = 220 age()= 45 process 2 end, sum = 221 % ./race 1000 race 2 processes, loop upper bound = 1000 process 1 process 2 age()= 2163 process 1 end, sum = 167167000 age()= 2173 process 2 end, sum = 167624310 */