multithreading - 内存屏障/栅栏如何抑制 CPU 执行的指令重新排序?

标签 multithreading memory-barriers

据我所知,编译器和CPU都可以进行指令重排序。 通过“由CPU执行”,我的意思是我不关心由编译器完成的指令重新排序以及由存储缓冲区和CPU缓存引起的重新排序。 对于由 Store Buffer 和 CPU Cache 引起的重新排序,这在this中讨论过。论文中,我已经了解了内存屏障如何抑制这种重新排序(内存重新排序)。

我关心的是这样的重新排序:

源代码:

data=1; //statement1
ready=true;//statement2

但是,运行在CPU0上的ThreadA按以下顺序执行上述代码:

ready=true;//statement2
data=1; //statement1

也就是说CPU对指令进行了重新排序,导致实际执行顺序与源代码指定的顺序不同。 众所周知,如果我们想要保留源代码的顺序,我们可以诉诸内存屏障(或栅栏),如下:

新源代码:

data=1; //statement1
smp_wb();//Insert a write barrier here!
ready=true;//statement2

所以我的问题是:内存屏障如何抑制指令重新排序?

最佳答案

@Tsyvarev 是正确的,它是特定于处理器(或处理器系列)的。 例如,在 ARM 下,DMB(内存屏障)会导致 CPU 管道停顿以确保排序(防止重新排序),如其 documentation说:

Figure 1 shows the DMB instruction being used to ensure memory ordering by stalling the pipeline

关于multithreading - 内存屏障/栅栏如何抑制 CPU 执行的指令重新排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34433941/

相关文章:

java - Retrofit 2 中同步请求和异步请求哪个更好

python - 创建可访问 app_globals 的 Pylons 线程

c# - 后台线程的 Toast 通知失败

java - 使用信号量的生产者/消费者;陷入僵局

c++ - 弃用 _writeBarrier()

c++ - 线程本地获取/释放同步

multithreading - 用于在 ipython/jupyter 笔记本中运行单元格的新线程

multithreading - 为什么内存重新排序在单核/处理器机器上不是问题?

linux - 如何理解 "A formal kernel memory-ordering model"中的试金石 #5?

c++ - 内存栅栏 : acquire/load and release/store