Busy-Wait Protocol ================== process P1; loop enter1 := true; { wants to enter } turn := "P2"; { but yields priority } while enter2 and turn = "P2" do skip; Critical Section; enter1 := false; { exits } Non-critical Section; end; end; process P2; loop enter2 := true; turn := "P1"; while enter1 and turn = "P1" do skip; Critical Section; enter2 := false; Non-critical Section; end; end; Mutual exclusion: ================= When P1 enters its CS, we know that enter1 = true and that either (1) enter2 = false, or (2) turn = "P1". (1) If enter2 = false, then P2 has entered its non-CS, will set enter2 = true and turn = "P1". Since enter1 = true, it will then busy-wait till P1 leaves its CS. (2) Else, if turn = "P1", then we know that P2 set turn = "P1" *after* P1 set enter1 = true and turn = "P2". So P2 must be busy-waiting! Fairness: ========= If P1 is busy-waiting, then enter1 = true, enter2 = true and turn = "P2". Eventually P2 will go around the loop and set turn = "P1", letting P1 proceed and forcing P2 to busy-wait. Similarly, if P2 wants to get into its CS, P1 will eventually let it do so, as long as its CS and non-CS eventually terminate.