问题描述
我看过这段代码(来自 arm),它基本上是在内存中增加一个变量,其他 PE(处理元素或线程)也在做同样的事情。因此,多个PE访问内存上的相同数据是一个临界区问题。
not_exec_core:
// Increment the sync variable to indicate this core is waiting
ldr x0,=core_sync
core_waiting:
ldr w1,[x0] // pull line into cache
dsb sy
isb
ldaxr w1,[x0]
add w1,w1,#1
stlxr w2,[x0]
cbnz w2,core_waiting
sev
核心首先将数据加载到 w1 寄存器中,注释说“将行拉入缓存”,我可以理解。然后给出数据和指令同步命令。所以缓存行已为这个 PE 填充(对于其他 PE 可能也这样做)。但是为什么它使用 ldaxr 指令(这是独占的原子方法)再次加载变量?为什么它不首先使用 ldaxr?
它增加值并以原子方式将其写回,如果不成功,则返回 core_waiting: 尝试增加值。
如果有人对此做出解释,我将不胜感激。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)