std::memory_order

Saw this at Tesla.

enum memory_order
{
    memory_order_relaxed,
    memory_order_consume,
    memory_order_acquire,
    memory_order_release,
    memory_order_acq_rel,
    memory_order_seq_cst
};
std::atomic<int> flag{0};
int data;
 
Thread A:
  data = 123;
  flag.store(1, std::memory_order_release);
 
Thread B:
  while (flag.load(std::memory_order_acquire) == 0) {}
  // now it's guaranteed to see data = 123
  std::cout << data;
 

Fences

#include <atomic>
 
std::atomic<int> flag{0};
int data;
 
void producer() {
    data = 123;                               // normal store
    std::atomic_thread_fence(std::memory_order_release);
    flag.store(1, std::memory_order_relaxed); // just signals
}
 
void consumer() {
    while (flag.load(std::memory_order_relaxed) == 0) {}
    std::atomic_thread_fence(std::memory_order_acquire);
    // now guaranteed to see data = 123
    int x = data;
}