2 * Dekker's critical section algorithm, implemented with fences.
3 * Translated to C by Patrick Lam <prof.lam@gmail.com>
6 * http://www.justsoftwaresolutions.co.uk/threading/
11 #include "libinterface.h"
13 /* atomic */ int flag0, flag1;
14 /* atomic */ int turn;
20 /* uint32_t */ int var = 0;
23 store_32(&flag0, true);
24 // std::atomic_thread_fence(std::memory_order_seq_cst);
38 store_32(&flag0, false);
48 store_32(&flag0, true);
54 // std::atomic_thread_fence(std::memory_order_acquire);
60 // std::atomic_thread_fence(std::memory_order_release);
61 store_32(&flag0, false);
65 store_32(&flag1, true);
66 // std::atomic_thread_fence(std::memory_order_seq_cst);
70 int f0 = load_32(&flag0);
78 store_32(&flag1, false);
86 store_32(&flag1, true);
87 // std::atomic_thread_fence(std::memory_order_seq_cst);
93 // std::atomic_thread_fence(std::memory_order_acquire);
99 // std::atomic_thread_fence(std::memory_order_release);
100 store_32(&flag1, false);
105 for(i=0;i<PROBLEMSIZE;i++) {
113 for(i=0;i<PROBLEMSIZE;i++) {
119 int user_main(int argc, char **argv)
123 store_32(&flag0, false);
125 store_32(&flag1, false);
129 thrd_create(&a, p0l, NULL);
130 thrd_create(&b, p1l, NULL);