R..*_*R.. 6 c assembly cpu-architecture memory-barriers
首先,一些上下文:我正在使用前C11,基于内联asm的原子模型,但出于此目的,我很高兴忽略C方面(以及任何编译器障碍问题,我可以处理另外)并认为它基本上只是一个asm/cpu架构问题.
假设我的代码如下:
various stores
barrier
store flag
barrier
Run Code Online (Sandbox Code Playgroud)
我希望能够flag从另一个cpu核心读取并得出结论various stores已经执行并且可见.是否可以在装载方面没有任何内存屏障指令的情况下这样做?显然,至少在某些cpu架构上是可能的,例如x86,其中任何一个核心都不需要显式的内存屏障.但总的来说呢?cpu arch是否有可能广泛变化?
如果 CPU 要重新排序负载,您的代码将需要负载屏障才能正常工作。有很多架构可以进行此类重新排序;有关一些示例,请参阅内存排序中的表。
因此,在一般情况下,您的代码确实需要负载屏障。
x86 并不是很典型,因为它提供了相当严格的内存排序保证。请参阅谁在 x86 上订购了内存栅栏?进行讨论。