Memory order for atomics (C++)

Overview

Memory order Description
memory_order_relaxed Unsafest, No ordering is guaranteed.
memory_order_acquire A load operation, No reads or writes in the current thread can be reordered before this load.
memory_order_release A store operation, No reads or writes in the current thread can be reordered after this store.
memory_order_seq_cst Default, A load operation does a memory_order_acquire and a store operation does a memory_order_release and a read-modify-write combines both.
memory_order_acq_rel Safest, Always combines memory_order_acquire and memory_order_release.

Showcase

#include <atomic>
#include <thread>
#include <iostream>

std::atomic<bool> ready(false);
int value = 0;

void writer() {
    value = 123;
    ready.store(true, std::memory_order_relaxed);
}

void reader() {
    while (!ready.load(std::memory_order_relaxed)) {}
    std::cout << value << "\n"; // might print 0
}

int main() {
    std::thread t1(writer);
    std::thread t2(reader);
    t1.join();
    t2.join();
}

With memory_order_relaxed it’s not assured, that line 9 gets executed before line 10.