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

时间:2014-08-06 10:45:44

标签: 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

    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...
}

并且,如果有帮助,这里是来自hpp文件的一些声明

class BasicLogger{
//... 
    //for debugging purpose only
    static std::map <boost::thread::id, int> threads;
    static int flushCnt;
}

及其在cpp中的定义

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
容器的

size显示3,而它打印4,就是这样,循环永远不会结束,应用程序显示cpu使用%100 +

  • 我认为没有其他人填满threads。这在我的申请结束时发生。
  • 除了ffffffff之外,我还看到了{Not-any-thread} !!!
  • 是的,我在析构函数中迭代一个静态成员(仅用于调试目的)。它看起来很奇怪,但我不确定它是否是我问题的根源。你觉得怎么样?

你能帮助我找出为什么我会这样做以及如何避免它吗?

2 个答案:

答案 0 :(得分:0)

我无法在代码中看到任何错误的但有一些可能帮助的建议:

  • 使用const_iterator进行迭代,因为您没有修改地图中的任何内容。
  • 在循环之前存储threads.end()
  • 使用++的预增量形式(所以++item而不是item++),因为您没有使用此操作的值,所以效率稍高。

for循环因此会结束:

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

否则,正如其他人所说,我只能假设另一个线程上的某些东西正在消耗地图中的一个条目,导致你的迭代器完全错过它的结尾。

答案 1 :(得分:0)

您的代码中的其他位置存在错误。

您是否在代码中的[]地图上使用了threads运算符?它可能会在地图中创建一个包含错误值的条目。尝试替换为at()的来电,除非您明确要求[]的插入副作用。

另一种可能性是您在程序中实例化两个BasicLogger。由于threads是静态的,BasicLogger将共享相同的theads变量。

另一种可能性是您尝试在两个不同的线程中更新threads映射(因为您的程序看起来是多线程的)。 std::map不是线程安全的,必须受互斥锁保护。

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