我有一个线程在完成后将值设置为true。在那之前我等待:
while(1)
{
if(done[0] == true)
{
break;
}
}
这段代码在Debug中运行得很好,但在Release中,它永远保留在循环中,即使调试器清楚地说它是真的而不是假的。
为什么这不起作用?
由于
答案 0 :(得分:14)
这是未将done
标记为volatile
的症状。
如果没有volatile
,优化编译器可以将值缓存在寄存器中。
e.g。
private volatile int i;
答案 1 :(得分:6)
另一方面,这不是(恕我直言)这样做的好习惯。 你可能(聪明地)简化你的问题,但是创建一个繁忙的循环来等待一些任务完成是一个糟糕的,容易出错的方法。 您应该使用一些锁定/事件机制(或者至少为循环添加睡眠)。
答案 2 :(得分:1)
这通常是一个糟糕的设计理念。
由于您使用的是VS,我猜您的目标是Windows,因此我建议您根据自己的标准查看WaitForSingleObjects or WaitForMultipleObjects。
或者,如果您只是在屏幕上更新内容,请查看WM_KICKIDLE。