线程 A 和 B 正在同时执行。哪些 ARMv8-A 内存屏障类型(如 DMB、DSB)足以满足后置条件,为什么?
Initially x1 = 0, x2 = 0
Thread A | Thread B
----------------------------------
x1 = 1 | x2 = 1
barrier | barrier
y1 = x2 | y2 = x1
Postcondition: (y1 == 1) || (y2 == 1)
我查看了DMB 和 DSB 的 ARMv8-A 架构参考手册内存模型定义,但无法推断出为什么即使使用 DSB 内存屏障,后置条件也会成立。我认为架构参考手册中的关键定义是:
DMB 指令确保执行 DMB 的 PE 执行的所有受影响的内存访问,这些访问按程序顺序出现在 DMB 之前,以及源自不同 PE [...] 的那些在 DMB 执行之前已经被 PE 观察到的内存访问,在 DMB 之后按程序顺序出现的任何受影响的内存访问之前被每个 PE 观察到,被那个 PE 观察到。
和
当满足以下所有条件时,由 PE [...] 执行的 DSB 完成:
在 DSB 之前按程序顺序出现的所需访问类型的所有显式内存访问对于所需共享域中的观察者集都是完整的。
[...]
和
此外,在 DSB 指令之后出现在程序顺序中的任何指令都不能改变系统的任何状态或执行其功能的任何部分,直到 DSB 完成,除了 [...]