首先,有一些背景知识:我正在使用基于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/

10-11 15:45