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