内存屏障
2026/8/24大约 1 分钟
内存屏障
内存屏障干一件事:
保证关键内存操作的先后顺序,防止乱序。
一个实际例子
任务 A:
data = 100;
flag = 1;任务 B:
while (flag == 0);
printf("%d\n", data);我们的要求很明确:
A:
data = 100
↓
flag = 1
B:
看到 flag = 1
↓
读取 data
↓
100但没有内存屏障时,在某些并发场景下,可能出现其他执行流先观察到:
flag = 1
data 还是旧值于是 B 可能读到旧的 data。
所以:
data = 100;
内存屏障();
flag = 1;就是告诉编译器/CPU:
data的内存访问不能随便越过屏障跑到flag后面。
volatile 和它的区别
volatile
→ 每次都去访问这个变量,别把访问优化掉
内存屏障
→ 前后的内存访问顺序不能乱所以:
volatile int flag;
data = 100;
内存屏障();
flag = 1;是两个不同层面的约束。
ARM 中
常见:
DMB → 保证内存访问顺序
DSB → 等待前面的操作完成
ISB → 刷新指令执行环境最终记忆
内存屏障不是让所有指令严格按顺序执行,而是让关键的内存访问顺序不能乱。

