C++ C++;While(1)循环不调用其内部的if语句
我有一个中断设置了一个标志,一个叫做recvd的bool,所以: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
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子句。这是多线程编程警告的一个很好的例子。实际上,有两种:
这是多线程编程警告的一个很好的例子。实际上,有两种:
你声明“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完全是为了破坏这种运气。