【问题标题】:Works on debug but not release适用于调试但不发布
【发布时间】:2010-06-02 03:34:45
【问题描述】:

我有一个线程在完成时将值设置为 true。在那之前我会等待:

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

        break;
    }
}

这段代码在 Debug 中工作得很好,但在 Release 中它永远停留在循环中,即使调试器清楚地表明它是 true 而不是 false。

为什么这不起作用?

谢谢

【问题讨论】:

    标签: c++ c visual-studio multithreading


    【解决方案1】:

    这是未将done 标记为volatile 的症状。

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

    例如

    private volatile int i;
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        由于您使用的是 VS,我猜您的目标是 windows,所以我建议您根据您的条件查看 WaitForSingleObjects or WaitForMultipleObjects

        或者,如果您只是在屏幕上更新内容,可以查看WM_KICKIDLE

        【讨论】:

        • 同意。编译器在这里失败给了你很大的帮助!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-29
        相关资源
        最近更新 更多