• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 297,  comments - 15,  trackbacks - 0

            昨天解決了一個隱蔽的內(nèi)存泄漏問題,原因是pthread_create后的僵死線程沒有釋放導(dǎo)致的內(nèi)存持續(xù)增長。
            現(xiàn)象是這樣的:短時間內(nèi)程序運(yùn)行正常,但跑了12小時左右,用top查看其內(nèi)存占用居然高達(dá)2G,于是馬上意識到有內(nèi)存泄漏。

            最先想到的是malloc/free、new/delete沒有配對,申請的內(nèi)存沒有釋放。于是寫了個跟蹤malloc/free調(diào)用的模塊,不過檢查中并沒有找到未釋放的內(nèi)存。之后懷疑是不是 free then malloc 導(dǎo)致的內(nèi)存管理錯誤(事實證明雖然free后不是立即回收內(nèi)存,但是接連調(diào)用free & malloc并不會影響操作系統(tǒng)的內(nèi)存管理),不過寫了個小程序發(fā)現(xiàn)并不是這么回事。

            陷入窘境了,只好用最小系統(tǒng)法把功能部分和內(nèi)存分配都給屏蔽掉,這時發(fā)現(xiàn)內(nèi)存泄漏依然存在!仔細(xì)看top的輸出,幾乎是每次創(chuàng)建線程時內(nèi)存就往上漲一點,只是增長速度不是很快,看來是線程的問題了。仔細(xì)分析發(fā)現(xiàn),之前圖簡單 pthread_create (&thread, NULL, &thread_function, NULL); 就這么寫了,參數(shù)2沒有設(shè)置線程結(jié)束后自動detach,并且沒有使用pthread_join或pthread_detach釋放執(zhí)行結(jié)束后線程的空間!

             

            Linux man page 里有已經(jīng)說明了這個問題:
                When a joinable thread terminates, its memory resources (thread descriptor and stack) are not deallocated until another thread performs pthread_join on it. Therefore, pthread_join must be called  once  for each joinable thread created to avoid memory leaks.

            也就說線程執(zhí)行完后如果不join的話,線程的資源會一直得不到釋放而導(dǎo)致內(nèi)存泄漏!一時的圖快后患無窮啊。

             

            解決辦法

            代碼
             1 // 最簡單的辦法,在線程執(zhí)行結(jié)束后調(diào)用pthread_detach讓他自己釋放
             2 pthread_detach(pthread_self());
             3 
             4 
             5 // 或者創(chuàng)建線程前設(shè)置 PTHREAD_CREATE_DETACHED 屬性
             6 pthread_attr_t attr;
             7 pthread_t thread;
             8 pthread_attr_init (&attr);
             9 pthread_attr_setdetachstate (&attrPTHREAD_CREATE_DETACHED);
            10 pthread_create (&thread, &attr&thread_function, NULL);
            11 pthread_attr_destroy (&attr);

             

            第2行的那種方法最簡單,在線程函數(shù)尾部加上這句話就可以將線程所占用的資源給釋放掉;或者像 5-11 所示的方法設(shè)置detach屬性,這樣也會在線程return/pthread_exit后釋放內(nèi)存。

            其實仔細(xì)想想,valgrind檢查時已經(jīng)提示了pthread_create沒有釋放的問題,只是之前沒引起注意。其實這樣的問題也只有在長時間運(yùn)行時,慢慢積累這一點點的內(nèi)存才會暴露出來,看來valgrind的提示也不能置之不理啊。

            from:

            http://www.cnblogs.com/bits/archive/2009/12/04/no_join_or_detach_memory_leak.html

            posted on 2010-01-14 16:40 chatler 閱讀(3118) 評論(2)  編輯 收藏 引用 所屬分類: Linux_Coding

            FeedBack:
            # re: 解決Linux pthread_create內(nèi)存泄漏問題[未登錄]
            2010-06-02 17:08 | jack
            不錯,支持一個。  回復(fù)  更多評論
              
            # re: 解決Linux pthread_create內(nèi)存泄漏問題
            2012-05-03 10:07 | 朱先生
            我試過,每一種方法有的時候不行。
            第二種是可以的。
              回復(fù)  更多評論
              
            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺這個博客還是不錯,雖然做的東西和我不大相關(guān),覺得看看還是有好處的

            network

            OSS

            • Google Android
            • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
            • os161 file list

            overall

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            欧美午夜A∨大片久久 | 久久久久亚洲精品男人的天堂| 青青草原综合久久| 亚洲国产美女精品久久久久∴| 性欧美丰满熟妇XXXX性久久久| 久久香蕉国产线看观看精品yw| 亚洲国产精品久久久久婷婷老年| 激情久久久久久久久久| 久久久噜噜噜久久中文字幕色伊伊 | 国产福利电影一区二区三区,免费久久久久久久精| 99久久夜色精品国产网站| a高清免费毛片久久| 久久久免费观成人影院| 久久久久久久久久久久久久| 久久精品国产只有精品2020| 久久久久久A亚洲欧洲AV冫| 中文字幕无码精品亚洲资源网久久| 久久婷婷五月综合97色| 欧美精品一本久久男人的天堂| 久久综合一区二区无码| 久久99免费视频| 久久夜色精品国产噜噜麻豆| 国产精品九九久久免费视频 | 久久国产成人| 国产精品美女久久久| 国产香蕉久久精品综合网| 久久久精品视频免费观看| AV无码久久久久不卡蜜桃| 五月丁香综合激情六月久久| 久久久久国产一区二区| 久久91综合国产91久久精品| 午夜精品久久久久久久久| 久久精品无码一区二区WWW| 思思久久99热只有频精品66| 久久精品夜色噜噜亚洲A∨| 国产成人久久精品二区三区| 国产成人精品久久二区二区| 亚洲中文字幕无码一久久区| 久久天天躁狠狠躁夜夜不卡 | 蜜臀久久99精品久久久久久| 精品欧美一区二区三区久久久|