resource no_race_semaphores() var N : int := 10; getarg(1, N) var sum: int := 0 sem mutex := 1 # a semaphore 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 -> P(mutex) # pre-protocol: enter CRITICAL SECTION sum := fn(sum, i) V(mutex) # post-protocol: exit CRITICAL SECTION 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 no_race_semaphores /* ............... Example compile and run(s) % sr -o no_race no_race.sr % ./no_race race 2 processes, loop upper bound = 10 process 1 age()= 38 process 1 end, sum = 220 process 2 age()= 44 process 2 end, sum = 440 % sr -c no_race.sr % srl -L 1 -o no_race_L1 no_race_semaphores % ./no_race_L1 race 2 processes, loop upper bound = 10 process 1 process 2 age()= 55 process 1 end, sum = 385 age()= 60 process 2 end, sum = 440 % ./no_race 1000 race 2 processes, loop upper bound = 1000 process 1 process 2 age()= 10370 process 1 end, sum = 273546420 age()= 11468 process 2 end, sum = 334334000 */