2 * Dekker's critical section algorithm, implemented with fences.
5 * http://www.justsoftwaresolutions.co.uk/threading/
14 std::atomic<bool> flag0, flag1;
15 std::atomic<int> turn;
22 flag0.store(true, wildcard(1));
23 std::atomic_thread_fence(wildcard(2)); // seq_cst
25 while (flag1.load(wildcard(3)))
27 if (turn.load(wildcard(4)) != 0)
29 flag0.store(false, wildcard(5));
30 while (turn.load(wildcard(6)) != 0)
34 flag0.store(true, wildcard(7));
35 std::atomic_thread_fence(wildcard(8)); // seq_cst
39 std::atomic_thread_fence(wildcard(9)); // acquire
43 var.store(1, std::memory_order_relaxed);
45 turn.store(1, wildcard(10));
46 std::atomic_thread_fence(wildcard(11)); // release
47 flag0.store(false, wildcard(12));
52 flag1.store(true, wildcard(13));
53 std::atomic_thread_fence(wildcard(14)); // seq_cst
55 while (flag0.load(wildcard(15)))
57 if (turn.load(wildcard(16)) != 1)
59 flag1.store(false, wildcard(17));
60 while (turn.load(wildcard(18)) != 1)
64 flag1.store(true, wildcard(19));
65 std::atomic_thread_fence(wildcard(20)); // seq_cst
69 std::atomic_thread_fence(wildcard(21)); // acquire
73 var.store(2, std::memory_order_relaxed);
75 turn.store(0, wildcard(22));
76 std::atomic_thread_fence(wildcard(23)); // release
77 flag1.store(false, wildcard(24));
80 int user_main(int argc, char **argv)
89 thrd_create(&a, p0, NULL);
90 thrd_create(&b, p1, NULL);