C++11 存在原子内存访问时是否允许代码移动?

C++11 存在原子内存访问时是否允许代码移动?,c++11,atomic,compiler-optimization,C++11,Atomic,Compiler Optimization,看看下面的例子 #include <atomic> extern std::atomic<int> TheVal; extern std::atomic<bool> Ready; int Unrelated; void test() { for (int i=0; i<100; ++i) { Unrelated = 42; // A loop-invariant store if (Ready.load(std::memory_o

看看下面的例子

#include <atomic>

extern std::atomic<int> TheVal;
extern std::atomic<bool> Ready;
int Unrelated;

void test() {
  for (int i=0; i<100; ++i) {
    Unrelated = 42; // A loop-invariant store
    if (Ready.load(std::memory_order_acquire)) continue;
    TheVal.store(i, std::memory_order_release);
    Ready.store(1, std::memory_order_release);
  }
}
#包括
外部标准::原子TheVal;
外部标准::原子就绪;
int无关;
无效测试(){

对于(int i=0;我认为在假设规则下,优化是安全的。我不知道一个没有种族限制的程序怎么能分辨出差异。如果有另一个线程也写入不相关的<代码>,那么就存在数据竞争。如果没有其他线程写入不相关的<代码>,那么设置一次还是多次都无关紧要@IgorTandetnik是的,我倾向于这样想,但我想知道标准是否有任何部分指定是否允许这样做。标准没有明确指定所有可能的优化。相反,标准发布了“好像”规则:“[intro.execution]/1本国际标准中的语义描述定义了一个参数化的非确定性抽象机器。本国际标准对一致性实现的结构没有要求。特别是,它们不需要复制或模拟抽象机器的结构。相反,一致性实现要求o模拟(仅)抽象机器的可观察行为,如下所述。“根据此规则,如果生成的程序产生与未经优化的程序相同的可观察行为,则优化是有效的(或者更一般地说,如果优化产生了允许的可观察行为之一).另一种看待规则的方式:如果有效,则优化iff。没有一致性程序可以检测它是否已实际应用。
void test() {
  Unrelated = 42; // Move the loop-invariant store here
  for (int i=0; i<100; ++i) {
    if (Ready.load(std::memory_order_acquire)) continue;
    TheVal.store(i, std::memory_order_release);
    Ready.store(1, std::memory_order_release);
  }
}