



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、*技術(shù)期刊 2007年7月 總1期 內(nèi)部發(fā)行,注意保密Linux程序設(shè)計(jì)中由線程使用不當(dāng)引起的內(nèi)存泄漏作者:吳亮Linux程序設(shè)計(jì)中,創(chuàng)建線程時(shí)調(diào)用pthread_create()函數(shù),該函數(shù)原型如下:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);其中第二個(gè)參數(shù)attr為線程屬性指針,一般情況下,我們創(chuàng)建線程時(shí),若對(duì)線程屬性沒有特殊要求,都將此參數(shù)設(shè)為NULL。這也就使用了線程的默認(rèn)屬性非分離狀態(tài)(joinable,或稱可接
2、合狀態(tài))。之后,主線程必須在適當(dāng)?shù)臅r(shí)候調(diào)用pthread_join(),來接合(join,或等待,同步)子線程,同時(shí)釋放線程本身占用的資源。否則,線程資源將駐留內(nèi)存,直到整個(gè)進(jìn)程退出為止,若進(jìn)程會(huì)不斷的創(chuàng)建線程,則每創(chuàng)建一次線程都會(huì)導(dǎo)致內(nèi)存資源的消耗,很明顯,這樣就會(huì)構(gòu)成內(nèi)存泄漏!關(guān)于這個(gè)問題,本人查到了一些佐證:(1)Linux man page里是這樣講的: When a joinable thread terminates, its memory resources (thread descriptor and stack) are not deallocated until anoth
3、er thread performs pthread_join on it. Therefore, pthread_join must be called once for each joinable thread created to avoid memory leaks.(2)Linux高級(jí)編程里是這樣講的:可接合(非分離態(tài)的,需要等待)的線程,就像一個(gè)進(jìn)程一樣,當(dāng)它執(zhí)行結(jié)束時(shí),并沒有被GNU/Linux自動(dòng)清理,而它的退出狀態(tài)卻仍在系統(tǒng)內(nèi)掛著(這有點(diǎn)像僵尸進(jìn)程),直到另一個(gè)線程調(diào)用pthread_join()獲取其返回值時(shí),其資源才被釋放。* * * * * * * * * * * *
4、* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 對(duì)于線程資源的釋放,有兩種實(shí)現(xiàn)方法:(1)調(diào)用pthread_join()線程創(chuàng)建時(shí),默認(rèn)屬性是可接合的(joinable),那就需要主線程來等待,所以在創(chuàng)建這個(gè)線程后適當(dāng)?shù)臅r(shí)候就必須調(diào)用pthread_join()來等待子線程結(jié)束執(zhí)行,否則就會(huì)引起內(nèi)存泄漏!在調(diào)用pthread_create()開線程后,若線程屬性是joinable,則必須調(diào)用pthread_join()來等待子線程結(jié)束執(zhí)行,這是 Linux同步主線程和子線程的一
5、個(gè)機(jī)制,但是,這并不等于說,我要在pthread_create()開線程后立即調(diào)用pthread_join()來等待該線程結(jié)束執(zhí)行,的確,那樣的話跟你用普通函數(shù)調(diào)用來實(shí)現(xiàn)是沒有區(qū)別的,你完全可以在pthread_create()開線程后去做別的事情,等你覺得應(yīng)該等待該線程結(jié)束執(zhí)行時(shí)再調(diào)用pthread_join()。這就是說,假如你的線程采用了默認(rèn)屬性joinable,你就必須在適當(dāng)?shù)臅r(shí)候調(diào)用pthread_join()來同步主線程和子線程,同時(shí)釋放子線程的資源(線程描述符和堆棧,thread descriptor and stack)。假如你用了默認(rèn)線程屬性,即線程屬性為joinable,而
6、又沒有在適當(dāng)?shù)臅r(shí)候調(diào)用pthread_join(),那么該線程所占用的資源便不會(huì)被釋放(kind of like a zombie process),因此造成內(nèi)存泄漏。(2)將線程屬性設(shè)為分離狀態(tài)(detached)假如你不想或沒有必要同步主線程和子線程,那么就把子線程屬性設(shè)置為detached分離狀態(tài),那么子線程結(jié)束執(zhí)行后會(huì)自行銷毀其占用的資源。將線程屬性設(shè)為分離狀態(tài)(detached),這樣,子線程就屬于自我銷毀那種,子線程函數(shù)啟動(dòng)后跟主線程不再有"父子"關(guān)系(等待和被等待),退出線程時(shí)其資源會(huì)釋放。注意:創(chuàng)建線程時(shí),若屬性參數(shù)為NULL,則線程屬性默認(rèn)為可接合的(jo
7、inable,即需要主線程等待的)??梢栽诰€程創(chuàng)建時(shí)將其屬性設(shè)為分離狀態(tài)(detached),也可在線程創(chuàng)建后將其屬性設(shè)為分離的(detached)。* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 下面給出分離態(tài)和非分離態(tài)線程創(chuàng)建的代碼框架:(1)使用線程默認(rèn)屬性創(chuàng)建線程的代碼框架#include <pthread.h>void* thread_function (void* thread_arg)/* Do work
8、here. */pthread_exit(“Exiting from the thread_function!”); int main ()pthread_t thr; void* thread_result;pthread_create (&thr, NULL, &thread_function, NULL);/* Do other work here. */* The second thread must be joined by the initial(calling) thread before exit or elsewhere to avoid MEMORY LEA
9、KS */ pthread_join(thr, &thread_result); return 0; (2)將線程屬性設(shè)為detached的兩種方法的代碼框架方法一,在線程創(chuàng)建時(shí),通過屬性變量設(shè)置#include <pthread.h>void* thread_function (void* thread_arg)/* Do work here. */pthread_exit(.); int main ()pthread_attr_t attr;pthread_t thread;pthread_attr_init (&attr);pthread_attr_setde
10、tachstate (&attr, PTHREAD_CREATE_DETACHED);pthread_create (&thread, &attr, &thread_function, NULL);pthread_attr_destroy (&attr);/* Do work here. */* No need to join the second thread. */return 0; 方法二:線程創(chuàng)建后,通過調(diào)用pthread_detach()來設(shè)置注意:如果thread_function()做的工作足夠少的話,在pthread_create()返回
11、線程ID前,thread_function()可能就已經(jīng)結(jié)束了,而這個(gè)線程ID可能又被系統(tǒng)分配給了新創(chuàng)建的線程,假如新線程不打算使用分離態(tài),那下面的pthread_detach()調(diào)用就會(huì)引起錯(cuò)亂,實(shí)際上原來要設(shè)為分離態(tài)的線程并沒有設(shè)為分離態(tài),假如再?zèng)]有調(diào)用pthread_join()的話(實(shí)際上也不會(huì),因?yàn)檎{(diào)用了pthread_detach()就不該再調(diào)用pthread_join(),而且此時(shí)join的實(shí)際上是新線程),那就會(huì)導(dǎo)致該線程的資源不被釋放,而又引起內(nèi)存泄露。所以在這兒,pthread_detach()的調(diào)用還是需要綜合考量的。#include <pthread.h>void* thread_function (void* thread_arg)/* Do work here. */pthread_exit(.); int main ()pthread_t
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- T-ZZB 1584-2023 低壓電源系統(tǒng)的電涌保護(hù)器(SPD)
- 二零二五年度專業(yè)技術(shù)師徒傳承合作合同
- 2025年度門店合作線上線下融合營(yíng)銷協(xié)議
- 二零二五年度不占股份分紅權(quán)益共享協(xié)議
- 二零二五年度招商引資合同中的政府與企業(yè)合作模式創(chuàng)新
- 2025年度終止供貨協(xié)議函范文模板與簽訂程序指導(dǎo)
- 二零二五年度綠色建筑產(chǎn)業(yè)廠房租賃服務(wù)協(xié)議
- 二零二五年度勞動(dòng)合同法未簽訂合同員工競(jìng)業(yè)禁止協(xié)議
- 二零二五年度物業(yè)安全管理人員勞動(dòng)合同范本
- 二零二五年度消防安全設(shè)施設(shè)備安全評(píng)估與整改服務(wù)合同
- 中國(guó)傳媒大學(xué)《主持人即興口語(yǔ)表達(dá)》課件-第1章 主持人即興口語(yǔ)表達(dá)概述
- 工程分包計(jì)劃(完整版)
- Q∕GDW 12068-2020 輸電線路通道智能監(jiān)拍裝置技術(shù)規(guī)范
- CIR操作指南(20110513)
- 領(lǐng)導(dǎo)力培訓(xùn)領(lǐng)導(dǎo)力提升培訓(xùn)領(lǐng)導(dǎo)力培訓(xùn)
- 制藥工程 專業(yè)英語(yǔ) Unit 1(課堂PPT)
- 俞敏洪四級(jí)詞匯詞根聯(lián)想記憶法亂序wordlist
- 第四次工業(yè)革命ppt課件
- 公路工程試驗(yàn)常規(guī)檢測(cè)項(xiàng)目、檢測(cè)標(biāo)準(zhǔn)、檢測(cè)頻率、取樣方法(標(biāo)準(zhǔn)版)
- 圖解調(diào)音臺(tái)使用說明(共14頁(yè))
- 員工人事檔案登記表(最終版)
評(píng)論
0/150
提交評(píng)論