Memory Ordering
Memory order semantics
Interview Relevant: Advanced concurrency
Memory Ordering
Control how memory operations are ordered.
Code Examples
Memory ordering for correct concurrent code.
cpp
1atomic<bool> ready(false);
2atomic<int> data(0);
3
4// Producer
5void producer() {
6 data.store(42, memory_order_relaxed);
7 ready.store(true, memory_order_release); // Sync point
8}
9
10// Consumer
11void consumer() {
12 while (!ready.load(memory_order_acquire)) {} // Sync point
13 assert(data.load(memory_order_relaxed) == 42); // Guaranteed!
14}
15
16// Memory orders:
17// memory_order_relaxed: No ordering, just atomicity
18// memory_order_acquire: Reads after this see writes before release
19// memory_order_release: Writes before this visible after acquire
20// memory_order_acq_rel: Both acquire and release
21// memory_order_seq_cst: Total ordering (default, safest)
22
23// Release-acquire establishes happens-before relationship
24
25// Fences for non-atomic code
26void withFence() {
27 data = 42; // Non-atomic
28 atomic_thread_fence(memory_order_release);
29 ready.store(true, memory_order_relaxed);
30}