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.