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.