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);
35 store_32(&flag0, false);
37 if (!load_32(&turn)) {
44 store_32(&flag0, true);
50 // std::atomic_thread_fence(std::memory_order_acquire);
56 // std::atomic_thread_fence(std::memory_order_release);
57 store_32(&flag0, false);
61 store_32(&flag1, true);
62 // std::atomic_thread_fence(std::memory_order_seq_cst);
66 int f0 = load_32(&flag0);
71 if (!load_32(&turn)) {
72 store_32(&flag1, false);
79 store_32(&flag1, true);
80 // std::atomic_thread_fence(std::memory_order_seq_cst);
84 // std::atomic_thread_fence(std::memory_order_acquire);
90 // std::atomic_thread_fence(std::memory_order_release);
91 store_32(&flag1, false);
96 for(i=0;i<PROBLEMSIZE;i++) {
104 for(i=0;i<PROBLEMSIZE;i++) {
110 int user_main(int argc, char **argv)
114 store_32(&flag0, false);
116 store_32(&flag1, false);
120 thrd_create(&a, p0l, NULL);
121 thrd_create(&b, p1l, NULL);