2010-06-02 103 views
2

我有一个线程在完成时将值设置为true。在那之前我等待:适用于调试但不发布

while(1) 
{ 
    if(done[0] == true) 
    { 

     break; 
    } 
} 

此代码工作得很好的调试,但释放它停留在永远循环下去,即使调试明确说,它是真实的,不是虚假的。

为什么这不起作用?

由于

回答

14

这是对症不标记donevolatile的。

没有volatile优化编译器可以将值缓存在寄存器中。

例如

private volatile int i; 
+0

是的,伎俩!谢谢 – jmasterx 2010-06-02 03:38:31

6

在附注中,不是(恕我直言)这样做的好实践。 您可能(巧妙地)简化了您的问题,但创建一个像这样的等待某个任务完成的繁忙循环是一个糟糕的,容易出错的方法。 你应该使用一些锁定/事件机制(或者至少在循环中加入睡眠)。

1

这通常是一个糟糕的设计理念。

由于您使用VS我猜你是针对Windows,所以我建议你看看你的标准WaitForSingleObjects or WaitForMultipleObjects

或者如果你只是更新屏幕上的东西,也许看看WM_KICKIDLE

+0

同意。编译器通过在这里失败给你一个很大的帮助! – NickZoic 2010-06-02 05:37:23

相关问题