// two threads work on a single variable int i = 0; par { i = i+1; } // critical region { i = 2*i; } // critical region end par print(i) // Expected results: 2 or 1 (non-determinism, race condition) // but can be also 0 without safe critical regions! // Solution: semaphore [Dijkstra, 1968] // Semaphor atomic(!) operations: P(s) { if s.value > 0 then s.value = s.value - 1; else } V(s) { if then else s.value = s.value + 1; } // same example with semaphore: int i = 0; Sempahore s = 1; // binary par { P(s); i = i+1; V(s); } // critical region { P(s); i = 2*i; V(s); } // critical region end par print(i)