这是我的应用程序中的一个析构函数的一段代码。请看一下调试部分
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}
!!! 你能帮助我找出为什么我会这样做以及如何避免它吗?
答案 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。