在C11和C ++ 11标准中,出现了一个声明潜在共享内存位置。这是什么意思?是否所有全局变量都可能在多线程环境中共享?
答案 0 :(得分:2)
不太熟悉C标准。在C ++ 14中,短语“潜在共享内存位置”出现两次,在两个非规范性注释中:
[intro.multithread] / 25 [注意:编译器转换,将潜在共享内存位置的分配引入,不会被修改本标准通常排除抽象机器,因为在抽象机器执行不会遇到数据竞争的情况下,这样的分配可能会覆盖不同线程的另一个分配。这包括覆盖不同内存位置中相邻成员的数据成员分配的实现。在所讨论的原子可能混淆的情况下,原子载荷的重新排序通常也被排除,因为这可能违反一致性规则。 - 结束记录]
[intro.multithread] / 26 [注意:引入潜在共享内存位置的推测性读取的转换可能无法保留由于它们可能引入数据竞争,因此本标准中定义的C ++程序的语义。但是,它们通常在优化编译器的上下文中有效,该编译器针对具有明确定义的数据争用语义的特定计算机。对于不能容忍比赛或提供硬件竞赛检测的假想机器,它们无效。 - 结束记录]
从上下文来看,很明显“潜在的共享内存位置”应该是指“优化器不能排除其他线程可能访问它的内存位置”,因此应该继续悲观的假设它们威力。”然后,这两个注释讨论了在这种假设下可能会或可能不会进行某些优化的合法性。
Re:全局变量。是的,任意线程通常都可以访问全局变量。原则上可以想象,执行整个程序优化的复杂优化器可能能够证明特定的全局变量永远不会从多个线程同时访问(我不知道当前存在的任何实际编译器能够实现这样的壮举,但我不会在任何方面称自己为编译专家。除此之外,全局变量占用的内存位置应由优化器视为可能共享。