鍍金池/ 問答/C++  數(shù)據(jù)庫/ c++ 在遍歷map的時候死循環(huán)?

c++ 在遍歷map的時候死循環(huán)?

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

死循環(huán)的代碼如上,每次都是上線跑了一天多之后死循環(huán)的,cpu100%,死活找不到原因,恕不方便貼上全部代碼。只想請問各位牛人,在map處死循環(huán)一般都會有哪些情況?

ps:哦對,忘了補充,業(yè)務(wù)部分是單線程處理的。

回答
編輯回答
解夏
  1. cpu在做密集的計算才會導(dǎo)致100%,最常見的例子就執(zhí)行的循環(huán)次數(shù)過多,要不就是那種死循環(huán)。
  2. 回到你的代碼上來,你這個函數(shù)沒有邏輯問題,但是存在性能問題,你的外層map元素個數(shù)到達10萬乃至百萬時,循環(huán)需要執(zhí)行很多次才能退出。
  3. 優(yōu)化的方式:要嘛增加修改查詢條件,加一個userid,查詢只需要做兩次map的find操作;要嘛修改存數(shù)據(jù)結(jié)構(gòu)提高查詢效率。
2017年1月19日 17:46
編輯回答
咕嚕嚕

linux會有死掉的原因,看message重有沒有oom killer的相關(guān)打印。如果是死循環(huán),只能通過對比svn等排查可能死循環(huán)的地方。

如果是段錯誤或者其他問題死機,linux內(nèi)核會有相應(yīng)的捕獲 coredump或者crash(vmcore信息等),單純的這么看代碼我覺得很難找到原因,必須借助相應(yīng)的工具。

有死循環(huán)的話linux在/var/log/message中會有記錄,你看下message,oom kiiler會在內(nèi)存緊張的時候,會依次kill內(nèi)存占用較高的進程,里面會記錄一些如pid,process name,cpu mask,trace等信息,通過監(jiān)控可以發(fā)現(xiàn)類似問題。

2017年4月12日 17:29
編輯回答
終相守

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

另外你的算法復(fù)雜度可能有問題

2018年2月24日 02:00
編輯回答
初心

代碼,沒啥問題,一般像這種問題,不要自己手動寫循環(huán)遍歷,盡量使用 #include <algorithm> 里面的算法方法,比如 find_if()。
還有進入這個函數(shù)之前,打印下 m_hashClubs.size(), 確認下是否size過大,然后查看size過大的原因。
還有很少有人會遍歷map吧,map就是為了快速索引啊,如果還要遍歷,那要map干啥?修改設(shè)計吧。

2017年4月11日 15:46
編輯回答
吢丕

單純從邏輯來說,影響這段for循環(huán)次數(shù)的it1只在++it1處改變了值,不應(yīng)該存在死循環(huán)的情況。CPU運行100%的的原因可能在別的地方。

2017年7月26日 15:16
編輯回答
黑與白

牛逼,遍歷map

2017年2月28日 23:57
編輯回答
墻頭草

這個問題有答案了嗎?我好像也遇到類似問題了

2018年3月11日 18:04