考虑以下:
#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 屏障?
编辑:将障碍改为全围栏。制作片段 C++。