• <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

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

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

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

             

            Linux man page 里有已經說明了這個問題:
                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.

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

             

            解決辦法

            代碼
             1 // 最簡單的辦法,在線程執行結束后調用pthread_detach讓他自己釋放
             2 pthread_detach(pthread_self());
             3 
             4 
             5 // 或者創建線程前設置 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行的那種方法最簡單,在線程函數尾部加上這句話就可以將線程所占用的資源給釋放掉;或者像 5-11 所示的方法設置detach屬性,這樣也會在線程return/pthread_exit后釋放內存。

            其實仔細想想,valgrind檢查時已經提示了pthread_create沒有釋放的問題,只是之前沒引起注意。其實這樣的問題也只有在長時間運行時,慢慢積累這一點點的內存才會暴露出來,看來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 閱讀(3126) 評論(2)  編輯 收藏 引用 所屬分類: Linux_Coding

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

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

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

            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

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品国产精品亚洲下载| 久久久久亚洲爆乳少妇无| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 无码久久精品国产亚洲Av影片 | 午夜人妻久久久久久久久| 精品无码久久久久久尤物| 亚洲国产精品婷婷久久| 亚洲日韩欧美一区久久久久我| 久久久久久久久久久久久久| 99久久人妻无码精品系列蜜桃| 狠狠精品久久久无码中文字幕 | 亚洲午夜久久影院| 无码AV中文字幕久久专区| 国产精品一区二区久久精品无码| 影音先锋女人AV鲁色资源网久久| 久久大香香蕉国产| 欧美亚洲国产精品久久| 久久综合九色综合久99 | 精品久久久久久久久中文字幕| 热久久视久久精品18| 色综合色天天久久婷婷基地| 三级三级久久三级久久| 久久久久久久久久久免费精品| 久久精品国产亚洲AV无码偷窥| 亚洲伊人久久综合中文成人网| 一级做a爰片久久毛片16| 国产成人精品久久免费动漫| 国产精品久久久久久久久软件 | 久久九九久精品国产免费直播| 九九热久久免费视频| 久久―日本道色综合久久| 久久久久亚洲Av无码专| 久久夜色精品国产欧美乱| 久久久久久国产精品无码下载| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久久WWW成人免费毛片| 国产 亚洲 欧美 另类 久久| 久久精品国产99国产精品澳门| 国产精品18久久久久久vr| 日本道色综合久久影院| 国产精品免费久久久久影院|