2 * Dekker's critical section algorithm, implemented with fences.
5 * http://www.justsoftwaresolutions.co.uk/threading/
9 #include "cds_threads.h"
10 //#include "cds_atomic.h"
15 std::atomic<bool> flag0, flag1;
16 std::atomic<int> turn;
22 // std::this_thread::sleep_for(std::chrono::milliseconds(10));
24 flag0.store(true,std::memory_order_relaxed);
25 //std::atomic_thread_fence(std::memory_order_seq_cst);
27 while (flag1.load(std::memory_order_relaxed))
29 if (turn.load(std::memory_order_relaxed) != 0)
31 flag0.store(false,std::memory_order_relaxed);
32 while (turn.load(std::memory_order_relaxed) != 0)
36 flag0.store(true,std::memory_order_relaxed);
37 std::atomic_thread_fence(std::memory_order_seq_cst);
41 std::atomic_thread_fence(std::memory_order_acquire);
46 turn.store(1,std::memory_order_relaxed);
47 std::atomic_thread_fence(std::memory_order_release);
48 flag0.store(false,std::memory_order_relaxed);
53 // std::this_thread::sleep_for(std::chrono::milliseconds(10));
55 flag1.store(true,std::memory_order_relaxed);
56 std::atomic_thread_fence(std::memory_order_seq_cst);
58 while (flag0.load(std::memory_order_relaxed))
60 if (turn.load(std::memory_order_relaxed) != 1)
62 flag1.store(false,std::memory_order_relaxed);
63 while (turn.load(std::memory_order_relaxed) != 1)
67 flag1.store(true,std::memory_order_relaxed);
68 std::atomic_thread_fence(std::memory_order_seq_cst);
72 std::atomic_thread_fence(std::memory_order_acquire);
77 turn.store(0,std::memory_order_relaxed);
78 std::atomic_thread_fence(std::memory_order_release);
79 flag1.store(false,std::memory_order_relaxed);
82 int user_main(int argc, char **argv)