首先,有一些背景知识:我正在使用基于C11的,基于行内asm的原子模型,但是出于这个目的,我很乐意忽略C方面(以及任何我可以处理的编译器障碍问题)并认为它本质上只是一个asm/cpu-architecture问题。
假设我有如下代码:
various stores
barrier
store flag
barrier
我希望能够从另一个cpu内核读取
flag
并得出结论,various stores
已经执行并且可见。是否可以在装载侧没有任何类型的内存屏障指令的情况下这样做?显然,至少在某些cpu架构上,例如在x86上,两个内核都不需要显式的内存屏障是可能的。但是总的来说呢? cpu arch是否有可能广泛地变化? 最佳答案
如果CPU要重新排序负载,则您的代码将需要负载屏障才能正常工作。有许多架构可以进行这种重新排序。有关示例,请参见Memory ordering中的表。
因此,在一般情况下,您的代码确实需要负载屏障。
x86不是很典型,因为它提供了非常严格的内存排序保证。参见Who ordered memory fences on an x86?进行讨论。
关于c - 是否可以仅在存储侧使用内存屏障,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26292827/