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)
31 flag0.store(true,std::memory_order_relaxed);
32 std::atomic_thread_fence(std::memory_order_seq_cst);
35 std::atomic_thread_fence(std::memory_order_acquire);
40 turn.store(1,std::memory_order_relaxed);
41 std::atomic_thread_fence(std::memory_order_release);
42 flag0.store(false,std::memory_order_relaxed);
47 flag1.store(true,std::memory_order_relaxed);
48 std::atomic_thread_fence(std::memory_order_seq_cst);
50 while (flag0.load(std::memory_order_relaxed))
52 if (turn.load(std::memory_order_relaxed) != 1)
54 flag1.store(false,std::memory_order_relaxed);
55 while (turn.load(std::memory_order_relaxed) != 1)
58 flag1.store(true,std::memory_order_relaxed);
59 std::atomic_thread_fence(std::memory_order_seq_cst);
62 std::atomic_thread_fence(std::memory_order_acquire);
67 turn.store(0,std::memory_order_relaxed);
68 std::atomic_thread_fence(std::memory_order_release);
69 flag1.store(false,std::memory_order_relaxed);
72 int user_main(int argc, char **argv)
80 thrd_create(&a, p0, NULL);
81 thrd_create(&b, p1, NULL);