Multithreading 什么是潜在的共享内存位置?

Multithreading 什么是潜在的共享内存位置?,multithreading,c++11,c11,Multithreading,C++11,C11,在C11和C++11标准中,出现了一条可能共享内存位置的语句。这是什么意思?所有全局变量都可能在多线程环境中共享吗?不太熟悉C标准。在C++14中,“潜在共享内存位置”出现两次,出现在两个非规范性注释中: [intro.multi-thread]/25[注:本标准通常不允许编译器转换将赋值引入到潜在共享内存位置,而该位置不会被抽象机器修改,因为在抽象机器无法执行的情况下,这样的赋值可能会覆盖另一个线程的赋值遇到了数据竞争。这包括覆盖单独内存位置中相邻成员的数据成员分配的实现。在有问题的原子可能存

在C11和C++11标准中,出现了一条可能共享内存位置的语句。这是什么意思?所有全局变量都可能在多线程环境中共享吗?

不太熟悉C标准。在C++14中,“潜在共享内存位置”出现两次,出现在两个非规范性注释中:

[intro.multi-thread]/25[注:本标准通常不允许编译器转换将赋值引入到潜在共享内存位置,而该位置不会被抽象机器修改,因为在抽象机器无法执行的情况下,这样的赋值可能会覆盖另一个线程的赋值遇到了数据竞争。这包括覆盖单独内存位置中相邻成员的数据成员分配的实现。在有问题的原子可能存在别名的情况下,原子负载的重新排序通常也被排除,因为这可能违反一致性规则。-结束注]

[intro.multi-thread]/26【注意】引入一个强的“潜在共享内存位置<强”的推测性阅读的转换可能无法保存本标准中定义的C++程序的语义,因为它们潜在地引入了数据竞争。然而,它们通常在以特定机器WI为目标的优化编译器的上下文中有效。数据竞争的定义良好的语义。对于不能容忍竞争或提供硬件竞争检测的假设机器,这些语义将无效。-结束说明]

从上下文来看,很明显,“潜在共享内存位置”应该是指“一个内存位置,优化器不能排除其他线程可能访问它的可能性,因此应该在悲观的假设下继续进行。”然后,这两个注释讨论了某些优化的合法性,在这种假设下,这些优化可能会进行,也可能不会进行


Re:全局变量。是的,一个全局变量通常可以被任意线程访问。原则上,一个执行整个程序优化的高级优化器可以证明一个特定的全局变量永远不会从多个线程并发访问(我不知道目前有任何真正的编译器能够实现这样的壮举,但无论如何我都不会称自己为编译器专家)。除此之外,全局变量占用的内存位置应由优化器视为可能共享。

我希望这取决于实现。任何东西都可能共享,除非实现能够证明它不可能。在C++14中,唯一看起来类似的短语是“潜在共享内存位置”。它出现两次,都出现在[intro.multithread]中的非规范性注释中。它似乎意味着“一个内存位置,优化器可能不会排除其他线程访问它的可能性。”“,因为注释讨论了某些优化的合法性。@Igor Tandetnik的问题已更正,谢谢。回答下半部分。可以想象,一个执行整个程序优化的高级优化器可能能够证明某个全局变量仅从一个线程使用过。”(我不认为今天存在的任何编译器都能进行这种推断)。如果不这样做,是的,每个全局变量都必须被视为一个潜在的共享内存位置。@Igor Tandetnik为什么不回答这个问题?