C++ While(1) 循环内部没有调用 if 语句



我有一个设置标志的中断,一个叫做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。 有什么想法吗? 有趣的是,当我在 while 语句的根中放置一个随机字符 printf 时,将调用 if 子句。

这是多线程编程注意事项的一个很好的例子。实际上,其中有两个:

  1. 编译器级优化。如果编译器可以提供有关值和执行路径的建议,则可以优化代码。有时,它做得非常显着(正如Shafik Yaghmaour在上面的评论中提到的)。

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

相关内容

  • 没有找到相关文章

最新更新