C++ While(1) 循环不在其中调用 if 语句

C++ While(1) loop is not calling if statement inside it

我有一个设置标志的中断,一个名为 recvd 的布尔值:

while (radio.available())
          {
            // Fetch the payload, and see if this was the last one.
            radio.read( &receive_payload, len );
            recvd = 1;
    radio.writeAckPayload(1,&ack,sizeof(ack));
    }

在我的 main() 中,我有一个 while(1) 循环和一个简单的 if 语句来检查标志是否已设置为 1:

// forever loop
while(1){
if (recvd == 1){toFloat(12);recvd = 0;}
}
}

这个函数永远不会被调用,即使我可以在中断处理程序中放置一个 printf 来为 recvd 提供值并且它吐出 1。 有任何想法吗? 有趣的是,当我将一个随机字符 printf 放在 while 语句的根部时,if 子句被调用。

这是多线程编程警告的一个很好的例子。实际上,有两个:

  1. 编译器级优化。如果您的编译器可以就值和执行路径提出建议,它可以优化您的代码。有时,它的作用非常显着(正如 Shafik Yaghmaour 在上面的评论中提到的那样)。

  2. CPU级优化。与编译器创建的代码相比,现代处理器可以以非常不同的方式执行您的代码。这里最著名的是 "out-of-order execution",它有助于 CPU 最大化代码速度并增加 memory/conveyor/etc 吞吐量。因此,如果您的 CPU 确定这两个语句之间没有相关性,那么它们是按原始顺序执行还是按相反顺序执行都没有区别。因此,一个线程可以 运行 非常领先于另一个线程(并破坏您的代码逻辑)。为避免这种情况,您必须了解内存栅栏和其他同步原语,了解它们如何影响您的代码。