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}

AI Tutor

Ask about the topic

Sign in Required

Please sign in to use the AI tutor

Sign In