【发布时间】:2020-02-25 05:23:26
【问题描述】:
线程 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)
我查看了ARMv8-A Architecture Reference Manual memory model definition of DMB and DSB,但无法推断为什么即使使用 DSB 内存屏障,后置条件也会成立。我认为架构参考手册中的关键定义是:
DMB 指令确保执行 DMB 的 PE 对所有受影响的内存访问,这些访问按程序顺序出现在 DMB 之前,以及来自不同 PE [...] 的那些在 DMB 之前被 PE 观察到的内存访问被执行,被每个 PE 观察 [...] 在 DMB 之后按程序顺序出现的任何受影响的内存访问被那个 PE 观察。
和
当满足以下所有条件时,PE [...] 执行的 DSB 完成:
在 DSB 之前按程序顺序出现的所需访问类型的所有显式内存访问对于所需共享域中的观察者集都是完整的。
[...]
和
此外,在 DSB 指令之后出现在程序顺序中的任何指令都不能改变系统的任何状态或执行其功能的任何部分,除非 [...]
【问题讨论】:
-
我会用 C/C++ 模型编写它,然后使用 recommended translation;它说“SeqCst Fence:
dmb ish” -
同核还是不同核?你看过 strex/ldrex 了吗?
标签: multithreading concurrency arm memory-barriers memory-visibility