2 * Dekker's critical section algorithm, implemented with fences.
5 * http://www.justsoftwaresolutions.co.uk/threading/
13 std::atomic<bool> flag0, flag1;
14 std::atomic<int> turn;
20 flag0.store(true,std::memory_order_relaxed);
21 std::atomic_thread_fence(std::memory_order_seq_cst);
23 while (flag1.load(std::memory_order_relaxed))
25 if (turn.load(std::memory_order_relaxed) != 0)
27 flag0.store(false,std::memory_order_relaxed);
28 while (turn.load(std::memory_order_relaxed) != 0)
32 flag0.store(true,std::memory_order_relaxed);
33 std::atomic_thread_fence(std::memory_order_seq_cst);
37 std::atomic_thread_fence(std::memory_order_acquire);
42 turn.store(1,std::memory_order_relaxed);
43 std::atomic_thread_fence(std::memory_order_release);
44 flag0.store(false,std::memory_order_relaxed);
49 flag1.store(true,std::memory_order_relaxed);
50 std::atomic_thread_fence(std::memory_order_seq_cst);
52 while (flag0.load(std::memory_order_relaxed))
54 if (turn.load(std::memory_order_relaxed) != 1)
56 flag1.store(false,std::memory_order_relaxed);
57 while (turn.load(std::memory_order_relaxed) != 1)
61 flag1.store(true,std::memory_order_relaxed);
62 std::atomic_thread_fence(std::memory_order_seq_cst);
66 std::atomic_thread_fence(std::memory_order_acquire);
71 turn.store(0,std::memory_order_relaxed);
72 std::atomic_thread_fence(std::memory_order_release);
73 flag1.store(false,std::memory_order_relaxed);
76 int user_main(int argc, char **argv)
84 thrd_create(&a, p0, NULL);
85 thrd_create(&b, p1, NULL);