首先,一些上下文:我使用的是基于in-asm的前CST原子模型,但出于这个目的,我很乐意忽略C方面(以及任何编译器障碍问题,我可以单独处理)并认为它基本上只是一个asm / cpu架构问题。
假设我的代码如下:
various stores
barrier
store flag
barrier
我希望能够从另一个cpu核心读取flag
并得出结论various stores
已经执行并且可见。是否有可能在加载端没有任何类型的内存屏障指令?显然,至少在某些cpu架构上是可能的,例如x86,其中任何一个核心都不需要显式内存屏障。但总的来说呢? cpu arch是否可以广泛地改变它?
答案 0 :(得分:3)
如果CPU要对负载进行重新排序,则代码需要加载障碍才能正常工作。有很多架构可以进行这种重新排序;有关示例,请参阅Memory ordering中的表格。
因此,在一般情况下,您的代码确实需要加载障碍。
x86不是很典型,因为它提供了非常严格的内存排序保证。有关讨论,请参阅Who ordered memory fences on an x86?。