gpt4 book ai didi

multithreading - 附近一字节变量的原子写入

转载 作者:行者123 更新时间:2023-12-03 12:46:01 25 4
gpt4 key购买 nike

假设,在多处理器机器上,有两个全局变量 A 和 B,每个都是一个字节大小,在内存中彼此靠近,两个 CPU 执行以下代码。

中央处理器 1:

read A
calculate new value
write A

中央处理器 2:

read B
calculate new value
write B

只要看看物理上会发生什么,我们预计在没有任何显式锁定的情况下上述内容是不正确的,因为 A 和 B 可能在同一个缓存行中,而 CPU 1 需要读取整个缓存行,更改单个字节的值并再次写入该行;如果 CPU 2 在其间对缓存行执行读-修改-写操作,则对 B 的更新可能会丢失。 (我假设 A 和 B 的更新顺序无关紧要,我只关心确保没有更新丢失。)

但是 x86 保证这段代码没问题。在 x86 上,只有当变量未对齐或大于 CPU 字长时,对单个变量的写入才会变为非原子。

x86 CPU 是否会自动在前端总线上执行额外的锁定,以便进行此类单独的变量更新,并在没有显式锁定的情况下正常工作?

最佳答案

由于缓存一致性协议(protocol),这段代码是正确的。当 CPU1 修改缓存行时,该行在 CPU 2 的缓存中变为 Invalid,CPU 2 无法写入 B,必须等待(状态机见 https://en.wikipedia.org/wiki/MESIF_protocol)。

因此没有更新丢失,也不需要总线锁。

关于multithreading - 附近一字节变量的原子写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43997676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com