以下摘录摘自网站https://lwn.net/Articles/262464/,它处理共享数据结构的读取不一致(为此创建了 RCU):
p = gp; if (p != NULL) { do_something_with(p->a, p->b, p->c); }
尽管此代码片段似乎很可能不会出现错误排序,但不幸的是,DEC Alpha CPU [PDF] 和值推测编译器优化可能会导致 p->a、p->b 和 p- >c 在 p 的值之前被获取!这在值推测编译器优化的情况下可能最容易看到,其中编译器猜测 p 的值,获取 p->a、p->b 和 p->c,然后获取 p 的实际值为了检查它的猜测是否正确。这种优化非常激进,也许是疯狂的,但确实发生在配置文件驱动优化的上下文中。
我不清楚上面的代码是否意味着在访问p->a
等时产生错误的 (*) 值,这让我感到害怕,或者它是否意味着“其他 CPU 可以观察到书面(源)顺序”这对我来说完全没问题。
如果第一个解释是正确的,我认为允许这种行为被破坏的系统(编译器)。我的问题是这个东西是否仍然存在,即使流行的架构(Alpha)可能已经消失了。
(*)p->a
来自一个记录和p->b
另一个记录或更糟的东西的错误值
PS:我没有检查,但我假设gp
变量被正确装饰atomic
或类似。