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;
}