#include // Note that although hogging the CPU while waiting for a variable to change // would be terrible in production code, it's great for testing since it // avoids a lot of messy context switching to get multiple threads synchronized. typedef std::atomic pseudo_barrier_t; #define pseudo_barrier_wait(barrier) \ do \ { \ --(barrier); \ while ((barrier).load() > 0) \ ; \ } while (0) #define pseudo_barrier_init(barrier, count) \ do \ { \ (barrier) = (count); \ } while (0)