2017-02-25 169 views
2

我一直在问的f和g这两个函数之间的区别:atomic.store和atomic_thread_fence之间有什么区别?

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,对不对?

+0

的例子是过于简单化。商店和装载仅影响一个内存位置,一个围栏影响所有内存位置。同步加载/存储对在某种意义上说是更经济更谨慎的同步方式。 –

+0

@KerrekSB是的,我认为在这种简单的情况下,它们应该具有相同的效果。 –

回答

2

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

无论其他线程读取a==123如果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); 
} 

两个断言不能点火

相关问题