2 * Dekker's critical section algorithm, implemented with fences.
5 * http://www.justsoftwaresolutions.co.uk/threading/
11 std::atomic<bool> flag0, flag1;
12 std::atomic<int> turn;
16 void __VERIFIER_assume(int b);
20 flag0.store(true, std::memory_order_relaxed);
22 while (flag1.load()) {
25 flag0.store(false, std::memory_order_relaxed);
26 while (turn.load() != 0) {
30 flag0.store(true, std::memory_order_relaxed);
38 var.store(1, std::memory_order_relaxed);
40 turn.store(1, std::memory_order_relaxed);
41 flag0.store(false, std::memory_order_relaxed);
45 flag1.store(true, std::memory_order_relaxed);
47 while (flag0.load()) {
48 if (turn.load() != 1) {
49 flag1.store(false, std::memory_order_relaxed);
50 while (turn.load() != 1) {
54 flag1.store(true, std::memory_order_relaxed);
61 var.store(2, std::memory_order_relaxed);
63 turn.store(0, std::memory_order_relaxed);
64 flag1.store(false, std::memory_order_relaxed);
67 void * p0l(void *arg) {
72 void * p1l(void *arg) {
77 int main(int argc, char **argv)
86 pthread_create(&a, 0, p0l, NULL);
87 pthread_create(&b, 0, p1l, NULL);