(* P *) producir nextp; while counter = n do no-op; buffer[in] := nextp; in := (in+1) mod n; counter := counter + 1; (* C *) while counter = 0 do no-op; nextc := buffer[out]; out := (out+1) mod n; counter := counter - 1; consumir nextc;
Las instrucciones se intercalan:
load counter, r1 load counter, r2 add r1, 1, r1 sub r2, 1, r2 store r1, counter store r2, counterEso es una condicion de carrera (race condition).
while turn <> i do no-op; <SC> turn := j;
var flag: array [0..1] of boolean; flag[i] := true; while flag[j] do no-op; <SC> flag[i] := false;
flag[i] := true; turn := j; while (flag[j] and turn=j) do no-op; <SC> flag[i] := false
Exclusión mutua.
flag[j] es falso o
turn = i.
turn no puede tener dos valores al mismo tiempo.
turn = j.
turn = j (de otro modo no pudo entrar),
así tiene que esperar.
flag[j] = true y está en el
loop while, turn puede ser i o
j.
flag[j] = true.
turn = i, y no cambiará
flag o turn hasta termina con la SC.