【发布时间】:2018-01-10 06:10:25
【问题描述】:
考虑以下几点:
#include <atomic>
std::atomic<unsigned> var;
unsigned foo;
unsigned bar;
unsigned is_this_a_full_fence() {
var.store(1, std::memory_order_release);
var.load(std::memory_order_acquire);
bar = 5;
return foo;
}
我的想法是 var 的虚拟负载应该防止 foo 和 bar 的后续变量访问在存储之前被重新排序。
似乎代码为重新排序设置了障碍 - 至少在 x86 上,发布和获取不需要特殊的屏蔽指令。
这是编写完整围栏(LoadStore/StoreStore/StoreLoad/LoadLoad)的有效方法吗?我错过了什么?
我认为该版本创建了 LoadStore 和 StoreStore 障碍。获取创建一个 LoadStore 和 LoadLoad 屏障。并且这两个变量访问之间的依赖关系创建了一个 StoreLoad 屏障?
编辑:将障碍更改为全围栏。制作 sn-p C++。
【问题讨论】:
-
这不是 C++
-
不清楚的问题,因为没有minimal reproducible example
-
更新为 C++。
-
C++ 标准中是否有任何内容需要
std::atomic<>的原子性才能应用于所讨论的变量以外的任何内容?
标签: c++ multithreading memory-model memory-fences