atomic.store 和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()都是发布逻辑的正确实现,并且表现相同。

如果var==0取决于是否获取数据,其他线程是否读取a==123

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

两个断言不能开火

最新更新