C++:导致奇怪行为的优化(卡在不满足条件的 while 循环中)

C++: Optimization causing weird behavior (stuck in a while-loop which doesn't have it's condition met)

这个问题困扰我好几天了,还没找到原因。每当我在调试模式下构建和 运行 我的程序时,一切 运行 都很好,但是,发布模式(有优化,没有优化也能正常工作)是另一回事。

程序的工作原理是,我有一个线程在继续之前等待一个名为 (bool) pipeReady 的成员变量被设置为 true,而我有另一个线程处理管道连接,在打开连接后它将遵循将 pipeReady 设置为 true 的函数的回调。

当通过单步执行程序来执行此操作时,它表现得非常奇怪(跳过行,跳过行,返回几行),但最后一切似乎都正常工作,除了 一个件事:this。即使不满足条件,它也会停留在该循环中。我知道这可能不是处理此问题的最佳方法,但它 应该 有效,不是吗?这怎么会发生?什么会导致这样的事情?为什么它只在优化开启时发生?

谢谢,安德烈

以后如果link坏了,说明调试器卡在这一行:

while(!pipeReady){};

根据调试器,pipeReady 的值为 true。

奇怪的调试器行为

调试器跳行的奇怪行为是由于编译器的优化。

当编译器生成新代码或删除代码时,源代码行号不会对齐。这混淆了 IDE 并显示调试器跳来跳去。例如,如果一个函数有多个 returns,编译器可能会为其他 returns 发出一个分支到第一个。这会导致一个 return 语句的步骤,这与源代码不符。

消除空循环。

编译器可能会消除这样的空循环:

 while (!pipe_ready)  
 {
 }

因为变量在循环内部没有改变。

要解决此问题,请将变量 pipe_ready 声明为 volatile