#include #include #include #include #include struct cs { void (*func)(int); int arg; _Atomic bool completed; }; int n; _Thread_local struct cs* request; struct cs* pendings; int var; void pause() { asm volatile("pause"); } void add(int val) { printf("add %d\n", val); var += val; } void* slave(void* _arg) { int i = (int)(uintptr_t)_arg; request = pendings + i; for(;;) { request->arg = 2; request->func = add; atomic_store(&request->completed, 0); while(!atomic_load(&request->completed)) pause(); request->arg = 1; request->func = add; atomic_store(&request->completed, 0); while(!atomic_load(&request->completed)) pause(); } } void master() { for(;;) { for(int i=0; i