intmain(int argc, charconst *argv[]) { // Init a atomic val std::atomic_flag f = ATOMIC_FLAG_INIT; // Free atomic f.clear(std::memory_order_release); // Get the old atomic bool x = f.test_and_set();
// Use atomic<> mode std::atomic<bool> b; // Read operation bool x = b.load(std::memory_order_acquire); b.store(true); // Write operation x = b.exchange(false, std::memory_order_acq_rel);
voidWriteX(){ // The order run. x.store(true, std::memory_order_seq_cst); }
voidWriteY(){ // The order run. y.store(true, std::memory_order_seq_cst); }
voidReadXThenY(){ // The order run. while (!x.load(std::memory_order_seq_cst)); if (y.load(std::memory_order_seq_cst)) { ++z; } std::cout << "Read X Then Y Function: "<< z.load() << std::endl; }
voidReadYThenX(){ // The order run. while (!y.load(std::memory_order_seq_cst)); if (y.load(std::memory_order_seq_cst)) { ++z; } std::cout << "Read Y Then X Function: "<< z.load() << std::endl; } voidRun(){ // Init atomic val be false. x = false; y = false;
voidWriteXThenY(){ // The order run. x.store(true, std::memory_order_relaxed); y.store(true, std::memory_order_relaxed); }
voidReadYThenX(){ // The order run. while (!y.load(std::memory_order_seq_cst)); if (x.load(std::memory_order_seq_cst)) { ++z; } std::cout << "Read Y Then X Function: "<< z.load() << std::endl; } voidRun(){ // Init atomic val be false. x = false; y = false;
voidWriteXThenY(){ // The order run. x.store(true, std::memory_order_release); y.store(true, std::memory_order_release); }
voidReadYThenX(){ // The order run. while (!y.load(std::memory_order_acquire)); if (x.load(std::memory_order_relaxed)) { ++z; } std::cout << "Read Y Then X Function: "<< z.load() << std::endl; } voidRun(){ // Init atomic val be false. x = false; y = false;
voidWork1(){ // First run. 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); // Set sync1 by atomic release mode. sync1.store(true, std::memory_order_release); }
voidTmpWork1(){ // First run. tmp_data[0].store(42, std::memory_order_relaxed); tmp_data[1].store(97, std::memory_order_relaxed); tmp_data[2].store(17, std::memory_order_relaxed); tmp_data[3].store(-141, std::memory_order_relaxed); tmp_data[4].store(2003, std::memory_order_relaxed); // Set sync by atomic release mode. sync.store(1, std::memory_order_release); }
voidWork2(){ // Second run. // Wait the sync1 to run. while (!sync1.load(std::memory_order_acquire));
// Set sync2 by atomic release mode. sync2.store(true, std::memory_order_release); }
voidTmpWork2(){ // Second run. // Wait the sync to run. int expected = 1; while (!sync.compare_exchange_strong(expected, 2, std::memory_order_acq_rel)) { expected = 1; } }
voidWork3(){ // Wait the sync2 to run. while (!sync2.load(std::memory_order_acquire));
// Check the run order. 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);
std::cout << "Run1 Right Run Logic." << std::endl; }
voidTmpWork3(){ while (sync.load(std::memory_order_acquire) < 2)
// Check the run order. assert(tmp_data[0].load(std::memory_order_relaxed) == 42); assert(tmp_data[1].load(std::memory_order_relaxed) == 97); assert(tmp_data[2].load(std::memory_order_relaxed) == 17); assert(tmp_data[3].load(std::memory_order_relaxed) == -141); assert(tmp_data[4].load(std::memory_order_relaxed) == 2003);
std::cout << "Run2 Right Run Logic." << std::endl; }