关于内存屏障

问题描述 投票:0回答:1

在NUMA多CPU架构中,

a
的初始值为0,并且在CPU-x和CPU-y之间处于共享状态。在时间 t0,CPU-x 执行
a = 1
,随后立即执行
smp_wmb
,然后在稍后的时间 t1,CPU-y 执行
b = a
,随后立即执行
smp_rmb
b
是否保证等于
1
之后的
smp_rmb

我的理解是不能保证。虽然

a = 1
首先被写入其存储缓冲区,然后读取无效消息被发送到 CPU-y 并添加到 CPU-y 的无效队列,并且确认被发送回 CPU-x,CPU-y 处理无效队列在
smp_rmb
之后,使其缓存无效并从 CPU-x 读取。然而,此时,CPU-x 可能正忙于其他事情,并且可能没有机会处理确认并刷新存储缓冲区。因此,CPU-y 在
smp_rmb
之后仍然可以从内存中读取旧值 0。我的理解正确吗?

linux-kernel memory-barriers
1个回答
0
投票

“是的,没错。”来自@Peter Cordes 在该问题下的评论。

© www.soinside.com 2019 - 2024. All rights reserved.