我有一个线程在完成时将值设置为true。在那之前我等待:适用于调试但不发布
while(1)
{
if(done[0] == true)
{
break;
}
}
此代码工作得很好的调试,但释放它停留在永远循环下去,即使调试明确说,它是真实的,不是虚假的。
为什么这不起作用?
由于
我有一个线程在完成时将值设置为true。在那之前我等待:适用于调试但不发布
while(1)
{
if(done[0] == true)
{
break;
}
}
此代码工作得很好的调试,但释放它停留在永远循环下去,即使调试明确说,它是真实的,不是虚假的。
为什么这不起作用?
由于
这是对症不标记done
为volatile
的。
没有volatile
优化编译器可以将值缓存在寄存器中。
例如
private volatile int i;
在附注中,不是(恕我直言)这样做的好实践。 您可能(巧妙地)简化了您的问题,但创建一个像这样的等待某个任务完成的繁忙循环是一个糟糕的,容易出错的方法。 你应该使用一些锁定/事件机制(或者至少在循环中加入睡眠)。
这通常是一个糟糕的设计理念。
由于您使用VS我猜你是针对Windows,所以我建议你看看你的标准WaitForSingleObjects or WaitForMultipleObjects。
或者如果你只是更新屏幕上的东西,也许看看WM_KICKIDLE。
同意。编译器通过在这里失败给你一个很大的帮助! – NickZoic 2010-06-02 05:37:23
是的,伎俩!谢谢 – jmasterx 2010-06-02 03:38:31