C++ While(1) 循环未调用其中的 if 语句

问题描述 投票:0回答:1

我有一个设置标志的中断,一个名为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 子句。

c++ if-statement while-loop interrupt radio-transmission
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.