我被问到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);
}
两个断言不能开火