在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。我的理解正确吗?
“是的,没错。”来自@Peter Cordes 在该问题下的评论。