c++ 在遍历map的时候死循环?

Club * ClubMgr::GetClub(clubid_t nClubId) const
{
    for (std::map<userid_t, std::map<clubid_t, Club* > >::const_iterator it1 = m_hashClubs.begin(); it1 != m_hashClubs.end(); ++it1)
    {
        std::map<clubid_t, Club* >::const_iterator it2 = it1->second.find(nClubId);
        
        if (it2 != it1->second.end())
        {
            return it2->second;
        }
    }
    return NULL;
}

死循环的代码如上,每次都是上线跑了一天多之后死循环的,cpu100%,死活找不到原因,恕不方便贴上全部代码。只想请问各位牛人,在map处死循环一般都会有哪些情况?

ps:哦对,忘了补充,业务部分是单线程处理的。

阅读 8k
7 个回答
  1. cpu在做密集的计算才会导致100%,最常见的例子就执行的循环次数过多,要不就是那种死循环。
  2. 回到你的代码上来,你这个函数没有逻辑问题,但是存在性能问题,你的外层map元素个数到达10万乃至百万时,循环需要执行很多次才能退出。
  3. 优化的方式:要嘛增加修改查询条件,加一个userid,查询只需要做两次map的find操作;要嘛修改存数据结构提高查询效率。

linux会有死掉的原因,看message重有没有oom killer的相关打印。如果是死循环,只能通过对比svn等排查可能死循环的地方。

如果是段错误或者其他问题死机,linux内核会有相应的捕获 coredump或者crash(vmcore信息等),单纯的这么看代码我觉得很难找到原因,必须借助相应的工具。

有死循环的话linux在/var/log/message中会有记录,你看下message,oom kiiler会在内存紧张的时候,会依次kill内存占用较高的进程,里面会记录一些如pid,process name,cpu mask,trace等信息,通过监控可以发现类似问题。

牛逼,遍历map

单纯从逻辑来说,影响这段for循环次数的it1只在++it1处改变了值,不应该存在死循环的情况。CPU运行100%的的原因可能在别的地方。

代码,没啥问题,一般像这种问题,不要自己手动写循环遍历,尽量使用 #include <algorithm> 里面的算法方法,比如 find_if()。
还有进入这个函数之前,打印下 m_hashClubs.size(), 确认下是否size过大,然后查看size过大的原因。
还有很少有人会遍历map吧,map就是为了快速索引啊,如果还要遍历,那要map干啥?修改设计吧。

userid_t 和 clubid_t operator<是如何定义的?

另外你的算法复杂度可能有问题

新手上路,请多包涵

这个问题有答案了吗?我好像也遇到类似问题了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题