使用if语句的奇怪行为

时间:2012-03-21 11:47:38

标签: c++ multithreading conditional-statements openscenegraph

我正在使用OpenSceneGraph开发一个应用程序,我在if语句中遇到了一些奇怪的行为。我不确定它是否特定于API,因为它对我来说在任何级别都没有意义。

代码:

if ( !fileAddList_.empty() )
{
    sg::FileStampThread::instance()->addFiles( fileAddList_ );
    fileAddList_.clear();
}

其中:

  • fileAddList_:用于维护的自定义对象的静态向量 文件名

  • FileStampThread:OpenThreads对象的实例

  • addFiles():线程中保存文件列表的方法 传递给它的对象

上面的代码在我的应用程序中实现了热量加载。 FileStampThread实例连续运行,检查传递给它的文件名的时间戳。标记更改后,文件名将保存到另一个列表中并传回以进行重新加载。

奇怪的是,当我启用此部分代码时,场景图的更新遍历(当执行此代码时)会大大减慢,即使没有要添加的文件(即使fileAddList_为空,也是如此) 。结果,更新遍历时间增加了一个数量级。

但是,如果我注释掉对sg :: FileStampThread :: addFiles的调用,那么减速就会消失。然而,我已经将调用困在调试模式中,它永远不会被执行。

所以,我很困惑:为什么在条件测试失败时条件内的一行代码会影响我的程序执行速度,从各方面看,它永远不会被执行?

作为旁注,我怀疑它可能与将变量声明为静态有关,所以我尝试将其声明为全局(使用extern),以达到同样的效果。


编辑以解决以下一些评论:

  • 该线程是OpenThreads对象的一个​​实例。没有特定于MS的 东西,这里。该实例是静态的。

  • addFiles()未模板化

  • 我测试了循环中的代码。我评论了这些台词 交替。我绝对积极地包含了addFiles() 电话是罪魁祸首。

  • 调试与发布没有什么不同,将代码推送到了 不幸的是,单独的功能没有改变。

  • OSG是高性能的,关于错误预测的评论可能是 就在。研究即将到来......

FileStampThread类的代码:

void sg::FileStampThread::addFiles( sg::AssetFileList& files )
{
    OpenThreads::ScopedLock<OpenThreads::Mutex> lock( contentMutex_ );

    for ( sg::AssetFileList::iterator it = files.begin(); it != files.end(); ++it )
    {
        if ( boost::filesystem::exists( (*it).getPath() ))
            fileList_.push_back( (*it) );
    }
};

1 个答案:

答案 0 :(得分:1)

尝试移动代码:

sg::FileStampThread::instance()->addFiles( fileAddList_ );
fileAddList_.clear();

在单独的函数中查看问题是否仍然存在。 难以忍受正在发生的事情,在发布和调试版本上的相同行为?