C++ C++;While(1)循环不调用其内部的if语句

C++ C++;While(1)循环不调用其内部的if语句,c++,if-statement,while-loop,interrupt,radio,C++,If Statement,While Loop,Interrupt,Radio,我有一个中断设置了一个标志,一个叫做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,&ac

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

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

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

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


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

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

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


  • 你声明“ReCDVD”为<代码>易失性>代码>?-我不是C++程序员,所以我从来没有遇到过!它起作用了!感谢you@PeterT:
    atomic
    比旧的
    volatile
    技巧要好。@Shafik实际上是重复的吗?千万不要将
    volatile
    用于多线程访问,它只用于与hardward对话。改用
    std::atomic
    !!!你声明“ReCDVD”为<代码>易失性>代码>?-我不是C++程序员,所以我从来没有遇到过!它起作用了!感谢you@PeterT:
    atomic
    比旧的
    volatile
    技巧要好。@Shafik实际上是重复的吗?千万不要将
    volatile
    用于多线程访问,它只用于与hardward对话。改用
    std::atomic
    #2混合了两个非常不同的概念。OOOE是一种东西,但仅限于CPU微体系结构级别的内部。至少在x86上,所有指令都必须按照最初发出的顺序失效,因此从程序员的角度来看,一切看起来都像是按顺序执行的。然而,混淆之处在于OOOE与不同的线程在彼此之前运行无关。这只是一个常规的旧竞争条件,正如您准确地规定的那样,用正确编写的同步代码解决了。@CodyGray,这完全正确,我的意思是,如果没有OoOE,您可能很幸运永远不会遇到这种奇怪的行为(因为线程的执行速度可能足够常规,使糟糕的代码正常工作)。但OoOE完全是在破坏这种运气。#2融合了两个截然不同的概念。OOOE是一种东西,但仅限于CPU微体系结构级别的内部。至少在x86上,所有指令都必须按照最初发出的顺序失效,因此从程序员的角度来看,一切看起来都像是按顺序执行的。然而,混淆之处在于OOOE与不同的线程在彼此之前运行无关。这只是一个常规的旧竞争条件,正如您准确地规定的那样,用正确编写的同步代码解决了。@CodyGray,这完全正确,我的意思是,如果没有OoOE,您可能很幸运永远不会遇到这种奇怪的行为(因为线程的执行速度可能足够常规,使糟糕的代码正常工作)。但OoOE完全是为了破坏这种运气。