Bee*_*ope 3

是的,某些 CPU 可能可以按照您的建议执行它。

即使您mfence在那里放置了更强大的围栏,或者使用锁定的指令,也肯定不能保证第一次写入不会被优化。

一般来说,这是正确的:排序和防护规则基本上告诉您哪些执行是不允许的,因此保证永远不会发生,但是考虑到允许发生的一组互补的执行,通常不能保证任何特定的执行实际上可以被执行。观察到的。

也就是说,我非常确定,在当前的 x86 芯片上,您总是能够偶尔观察到 10 值(即使完全省略栅栏),尽管有任何存储缓冲区合并,因为您偶尔可能会在两者之间遇到中断商店,让您阅读 10。

尽管如此,这并不能保证——人们当然可以想象像 Denver 或 Transmeta 这样的动态优化 x86 架构可以压缩上述序列,删除栅栏和第一个商店,使 20 成为唯一可观察到的值。

  • @Gilgamesz - `mfence` 不会导致上下文切换,我不认为我暗示了这一点。我只是说,即使有“更重”的栅栏,也不能保证在所有过去、现在和未来的 x86 芯片上都能遵守 10。当然,如果“mfence”需要很多周期,也许上下文切换更有可能靠近“mfence”指令,但我的答案中没有任何内容依赖于此,而且我并不完全遵循您对该效果的讨论。 (2认同)
  • @Gilgamesz - CPU 可以以与编译器重新组织和消除各种代码相同的方式删除栅栏,只要它保留了代码的有保证的语义。大多数 CPU 不会做太多这种类型的“优化”,因为它们实际上没有编译阶段(但即使如此,您也可以看到这些东西的提示,例如,使用 mov 消除、在循环缓冲区中展开等) 。然而,已经有二进制重新编译的 x86 CPU,例如 nVidia 的 Denver 和 Transmeta CPU,它们确实从 x86 机器代码编译成另一个特定于 CPU 的指令集。 (2认同)