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

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

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

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

             

            Linux man page 里有已經(jīng)說(shuō)明了這個(gè)問(wèn)題:
                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.

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

             

            解決辦法

            代碼
             1 // 最簡(jiǎn)單的辦法,在線程執(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行的那種方法最簡(jiǎn)單,在線程函數(shù)尾部加上這句話就可以將線程所占用的資源給釋放掉;或者像 5-11 所示的方法設(shè)置detach屬性,這樣也會(huì)在線程return/pthread_exit后釋放內(nèi)存。

            其實(shí)仔細(xì)想想,valgrind檢查時(shí)已經(jīng)提示了pthread_create沒(méi)有釋放的問(wèn)題,只是之前沒(méi)引起注意。其實(shí)這樣的問(wèn)題也只有在長(zhǎng)時(shí)間運(yùn)行時(shí),慢慢積累這一點(diǎn)點(diǎn)的內(nèi)存才會(huì)暴露出來(lái),看來(lá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 閱讀(3126) 評(píng)論(2)  編輯 收藏 引用 所屬分類: Linux_Coding

            FeedBack:
            # re: 解決Linux pthread_create內(nèi)存泄漏問(wèn)題[未登錄](méi)
            2010-06-02 17:08 | jack
            不錯(cuò),支持一個(gè)。  回復(fù)  更多評(píng)論
              
            # re: 解決Linux pthread_create內(nèi)存泄漏問(wèn)題
            2012-05-03 10:07 | 朱先生
            我試過(guò),每一種方法有的時(shí)候不行。
            第二種是可以的。
              回復(fù)  更多評(píng)論
              
            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

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

            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

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            精品久久综合1区2区3区激情| 久久精品国产99久久久香蕉| 久久中文骚妇内射| 日韩精品久久无码中文字幕| 女人香蕉久久**毛片精品| 久久精品一本到99热免费| 国产午夜电影久久| 久久婷婷五月综合色奶水99啪| 久久精品国产亚洲AV麻豆网站| 国产成人久久777777| 亚洲av成人无码久久精品| 国产激情久久久久影院小草| 久久久亚洲AV波多野结衣| 久久精品国产秦先生| 久久久久国产精品人妻| 久久精品一区二区| 亚洲va久久久噜噜噜久久男同| 久久天天躁狠狠躁夜夜2020老熟妇| 久久综合狠狠综合久久| 久久人人爽人人爽人人片AV东京热 | 无码人妻久久一区二区三区| 久久精品国产福利国产琪琪| 久久精品人人槡人妻人人玩AV | 久久青青草原国产精品免费| 伊人色综合久久天天人守人婷| 青青草国产精品久久久久| 99精品国产99久久久久久97| 欧美久久一区二区三区| 99久久精品免费看国产免费| 99久久99久久精品免费看蜜桃| 亚洲愉拍99热成人精品热久久| 思思久久99热只有频精品66| 色婷婷久久久SWAG精品| 久久免费视频一区| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久久久国产精品熟女影院| 99久久国产精品免费一区二区 | 久久综合中文字幕| 国产精品久久波多野结衣| 国产欧美久久久精品| 久久香蕉国产线看观看99|