我被问到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,对吧?
发布于 2017-02-25 08:22:30
两个函数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);
}两个断言都不能触发
https://stackoverflow.com/questions/42450342
复制相似问题