atomic.store 和 atomic_thread_fence 有什么区别?

What's the difference between atomic.store and atomic_thread_fence?

有人问我 f 和 g 这两个函数的区别:

atomic<int> var(1);
int a = 1;

void f() {
 a=123;
 var.store(0, std::memory_order_release);
}

void g() {
 a=123;
 std::atomic_thread_fence(std::memory_order_release);
 var.store(0, std::memory_order_relaxed);
}

在我看来它们具有相同的效果,因为如果其他线程读取 var=0 我们可以确定 a=123,对吗?

两个函数 f()g() 都是发布逻辑的正确实现并且行为相同。

其他线程是否读取a==123 if var==0取决于是否获取到数据:

if (var.load(std::memory_order_acquire) == 0)
{
    assert(a==123);
}

或:

if (var.load(std::memory_order_relaxed) == 0)
{
    std::atomic_thread_fence(std::memory_order_acquire);
    assert(a==123);
}

两个断言都不能触发