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);
}
两个断言都不能触发
有人问我 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);
}
两个断言都不能触发