我有一个设置标志的中断,一个名为recvd的bool如下:
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子句。
答案 0 :(得分:0)
这是多线程编程警告的一个很好的例子。实际上,有两个:
编译器级优化。如果您的编译器可以对值和执行路径提出建议,它可以优化您的代码。有时,它会非常显着(正如Shafik Yaghmaour在上面的评论中提到的那样)。
CPU级优化。与编译器创建的处理器相比,现代处理器可以以不同的方式执行代码。这里最着名的是“无序执行”,它可以帮助CPU最大化代码速度并增加内存/传送带/等吞吐量。因此,如果您的CPU决定这两个语句之间没有相关性,那么如果它们按原始顺序或以反向顺序执行则没有区别。因此,一个线程可以在另一个线程之前运行(并破坏您的代码逻辑)。为避免这种情况,您必须了解内存栅栏和其他同步原语,以及它们如何影响您的代码。