C++ 析构函数中的循环永远不会结束

C++ 析构函数中的循环永远不会结束,c++,boost,destructor,static-members,C++,Boost,Destructor,Static Members,这是我应用程序中的一个析构函数的一段代码。请看调试部分 BasicLogger::~BasicLogger(){ if (logFile.is_open()) { flushLog(); logFile.close(); } for (outIt it(out_.begin()); it != out_.end();safe_delete_item(it->second), it++); //debug code

这是我应用程序中的一个析构函数的一段代码。请看调试部分

BasicLogger::~BasicLogger(){
    if (logFile.is_open()) {
        flushLog();
        logFile.close();
    }
    for (outIt it(out_.begin()); it != out_.end();safe_delete_item(it->second), it++);

    //debug code

    std::cout << "Number of threads used: " << BasicLogger::threads.size() << std::endl;
    for(std::map <boost::thread::id, int>::iterator item = threads.begin(); item != threads.end(); item++)
    {
        std::stringstream out("");
        out << item->first;
        std::cout << "Thread[" << item->first << "] called out " << item->second << "  times" << std::endl;
    }

    std::cout << "Number of flushes to files " << BasicLogger::flushCnt  << std::endl;
    //debug...
}
容器的大小显示为3,而打印为4,也就是说,循环永不结束,应用程序显示cpu使用率为%100+

我认为没有其他人在填充线程。这发生在我的申请结束时。 除了ffffffff,我还看到了{没有任何线程}!!! 是的,我从析构函数中遍历静态成员只是为了调试。这看起来很奇怪,但我不确定这是否是我问题的根源。你怎么认为? 你能帮我找出为什么会出现这种情况以及如何避免这种情况吗?

我看不出代码有什么问题,但有一些建议可能会有所帮助:

使用常量迭代器进行迭代,因为您没有修改映射中的任何内容。 存储线程。循环前结束 使用预增量形式的++so++item,而不是item++,因为您没有使用此操作的值,因此效率稍高一些。 因此,for循环将以如下方式结束:

for(std::map <boost::thread::id, int>::const_iterator item = threads.begin(), end_item = threads.end(); item != end_item; ++item)
{
    ...
}

否则,正如其他人所说,我只能假设另一个线程上的某个线程正在使用映射中的某个条目,从而导致迭代器错过它的结尾。

代码中的其他地方有一个bug

您是否在代码中的任何位置使用线程映射上的[]运算符?它可能在地图中创建了具有错误值的条目。除非您明确希望[]的插入副作用,否则请尝试替换为对at的调用

另一种可能性是在程序中实例化两个基本阻塞器。由于线程是静态的,所以两个基本阻塞器将共享相同的THADS变量

还有一种可能性是,当程序看起来是多线程的时,您尝试在两个不同的线程中更新线程映射。映射不是线程安全的,必须由互斥锁保护


您还可以将调试代码移动到析构函数的最顶端,查看析构函数代码是否更改了此线程id。

尝试完全限定循环Basiclocker::threads而不是threads中的线程。这有用吗?我想,这就是它的条件!=threads.end永远不会为false。在循环过程中,线程是否有可能被其他线程修改?@molbdnilo不,它不是。@StefanWeiser不,它没有帮助
std::map <boost::thread::id, int> BasicLogger::threads= std::map <boost::thread::id, int>();
int BasicLogger::flushCnt = 0;
Number of threads used: 3
Thread[7f0a0c7e8700] called out 2  times
Thread[7f0a157ea700] called out 42  times
Thread[7f0a2f35a7c0] called out 15940  times
Thread[ffffffff] called out 1630561847  times
for(std::map <boost::thread::id, int>::const_iterator item = threads.begin(), end_item = threads.end(); item != end_item; ++item)
{
    ...
}