#include #include #include std::atomic data[5]; std::atomic sync1(false),sync2(false); void thread_1() { data[0].store(42,std::memory_order_relaxed); data[1].store(97,std::memory_order_relaxed); data[2].store(17,std::memory_order_relaxed); data[3].store(-141,std::memory_order_relaxed); data[4].store(2003,std::memory_order_relaxed); sync1.store(true,std::memory_order_release); } void thread_2() { while(!sync1.load(std::memory_order_acquire)); sync2.store(std::memory_order_release); } void thread_3() { while(!sync2.load(std::memory_order_acquire)); assert(data[0].load(std::memory_order_relaxed)==42); assert(data[1].load(std::memory_order_relaxed)==97); assert(data[2].load(std::memory_order_relaxed)==17); assert(data[3].load(std::memory_order_relaxed)==-141); assert(data[4].load(std::memory_order_relaxed)==2003); } int main() { std::thread t1(thread_1); std::thread t2(thread_2); std::thread t3(thread_3); t1.join(); t2.join(); t3.join(); }