專利名稱:線程托管對(duì)象的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種托管對(duì)象的方法,尤其涉及一種線程托管對(duì)象的方法。
背景技術(shù):
進(jìn)行構(gòu)件編程時(shí),通過引用計(jì)數(shù)管理對(duì)象的生命周期,當(dāng)不再使用一個(gè)對(duì)象時(shí),要 通過調(diào)用Release方法釋放對(duì)對(duì)象的引用。但是,在主函數(shù)MainO通過return返回時(shí),并不表示這個(gè)線程結(jié)束,而只是離開 了用戶的代碼,進(jìn)入消息循環(huán),如果用戶注冊了某個(gè)對(duì)象的回調(diào)事件,想獲得它的某個(gè)事件 通知,那么就必須拿著該對(duì)象的一次引用,以保證整個(gè)消息循環(huán)運(yùn)行期間這個(gè)對(duì)象都保持 有效。當(dāng)消息循環(huán)結(jié)束之后,線程真正準(zhǔn)備退出之時(shí),需要釋放對(duì)這個(gè)對(duì)象的引用,可此時(shí) 已經(jīng)離開了用戶代碼,用戶只能想辦法注冊消息循環(huán)結(jié)束的回調(diào)事件,并在回調(diào)函數(shù)里釋 放該對(duì)象。另外,如果某個(gè)對(duì)象在整個(gè)線程運(yùn)行期間都要被引用,但中間可能會(huì)因?yàn)檫\(yùn)行時(shí) 錯(cuò)誤而中斷退出,那么用戶就要在每個(gè)退出點(diǎn)釋放對(duì)象。
發(fā)明內(nèi)容
鑒于以上內(nèi)容,有必要提供一種線程托管對(duì)象的方法,通過對(duì)象托管,可以在線程 結(jié)束這一特殊時(shí)刻釋放對(duì)象,用戶就不必去檢查每個(gè)線程的退出點(diǎn),整個(gè)線程運(yùn)行期間不 必?fù)?dān)心對(duì)象無效,也不用擔(dān)心對(duì)象遺漏釋放的情況,從而減輕用戶的負(fù)擔(dān)。一種線程托管對(duì)象的方法,該方法包括如下步驟步驟1,在主函數(shù)中創(chuàng)建一個(gè)線程;步驟2,執(zhí)行線程的入口函數(shù),在線程的入口函數(shù)中調(diào)用線程函數(shù);步驟3,將線程函數(shù)中的對(duì)象指針插入到線程托管對(duì)象鏈表;及步驟4,當(dāng)線程函數(shù)執(zhí)行完畢時(shí),調(diào)用線程托管對(duì)象鏈表中插入的對(duì)象指針,釋放 對(duì)象,執(zhí)行結(jié)束。 相較于現(xiàn)有技術(shù),程序員可以借助設(shè)置一個(gè)線程托管對(duì)象鏈表,對(duì)線程中的對(duì)象 進(jìn)行托管,通過托管,當(dāng)線程結(jié)束時(shí),自動(dòng)釋放被托管對(duì)象的一次引用。通過線程托管在主 函數(shù)MainO方法里托管一個(gè)對(duì)象,當(dāng)線程即將結(jié)束時(shí)自動(dòng)釋放一次引用,用戶既不必?fù)?dān)心 線程運(yùn)行期間對(duì)象的有效性,也不必費(fèi)事地找時(shí)機(jī)釋放對(duì)象。此外,通過托管來管理對(duì)象的生命周期,會(huì)在線程結(jié)束時(shí)自動(dòng)釋放對(duì)象,用戶就不 必去檢查每個(gè)線程的退出點(diǎn),整個(gè)線程運(yùn)行期間不必?fù)?dān)心對(duì)象無效,也不用擔(dān)心對(duì)象遺漏 釋放的情況,從而減輕用戶的負(fù)擔(dān)。
圖1是本發(fā)明線程托管對(duì)象的方法較佳實(shí)施例的主流程圖。圖2是圖1中步驟S30的細(xì)化流程圖。
圖3是圖1中步驟S40的細(xì)化流程圖。
具體實(shí)施例方式如圖1所示,是本發(fā)明線程托管對(duì)象的方法較佳實(shí)施例的流程圖。在本較佳實(shí)施 例中,首先以如下構(gòu)建的代碼來進(jìn)行說明用戶定義的線程函數(shù)代碼ECode UserRoutine (…){CFoo New (&pFoo);CObjectReleaseAtThreadQuit(pFoo);Return N0ERR0R ;// 退出}主函數(shù)代碼ECode ElastosMain (…){IThread氺pThreadCThread::New(&UserRoutine,0, NULL, &pThread) ;// 創(chuàng)建一個(gè)新線程 UserRoutinepThread- > Join (INFINITE, NULL) ;// 等待線程結(jié)束return N0ERR0R_EXIT ;//直接退出程序}用圖1所示的流程描述上述構(gòu)建的代碼。步驟S10 在主函數(shù)中創(chuàng)建一個(gè)線程。該線程運(yùn)行用于執(zhí)行用戶定義的線程函 數(shù)。具體而言,上述主函數(shù)的代碼中,首先聲明一個(gè)線程指針PThread,然后通過創(chuàng)建動(dòng) 作,即CThread: :New(&UserRoutine,0, NULL, &pThread),創(chuàng)建一個(gè)線程,該線程名稱為 UserRoutine。步驟S20 執(zhí)行線程的入口函數(shù),在線程的入口函數(shù)中調(diào)用線程函數(shù)。入口函數(shù)的 具體代碼如下ECode ThreadEntry (PVoid pParam)//線程的入 口函數(shù){ECode ec =(氺pUserFunc) (pParam);CleanupListO ;//清理線程托管對(duì)象鏈表}。上述代碼中ECode ec = UserFunc (pParam)為調(diào)用線程函數(shù),其中pParam為參數(shù), 具體而言,在本較佳實(shí)施例中,調(diào)用的線程函數(shù)為UserRoutine ()。步驟S30 將線程函數(shù)中的對(duì)象指針插入到線程托管對(duì)象鏈表。具體代碼如下CObjectReleaseAtThreadQuit (pFoo);通過調(diào)用函數(shù)ReleaseAtThreadQuit ()將對(duì)象指針pFoo插入到線程托管對(duì)象鏈 表。所述插入的步驟在圖2中再做詳細(xì)描述。
4
步驟S40 當(dāng)線程函數(shù)執(zhí)行完畢時(shí),調(diào)用線程托管對(duì)象鏈表中插入的對(duì)象指針,釋 放對(duì)象,執(zhí)行結(jié)束。從執(zhí)行的結(jié)果可以看到,通過CObject ReleaseAtThreadQuit (pFoo)調(diào)用 ReleaseAtThreadQuitO函數(shù)即可將當(dāng)前線程中的對(duì)象進(jìn)行托管,當(dāng)線程結(jié)束時(shí),會(huì)自動(dòng)調(diào) 用被托管的對(duì)象指針,并釋放對(duì)象。在本較佳實(shí)施例中,線程函數(shù)中被托管的對(duì)象是一個(gè)構(gòu)件對(duì)象。此外,用戶也可以為一個(gè)線程中的多個(gè)對(duì)象進(jìn)行托管,這些線程托管對(duì)象會(huì)在線 程結(jié)束退出時(shí)按照托管順序的相反順序被調(diào)用執(zhí)行。在本較佳實(shí)施例中,線程UserRoutine 中的對(duì)象指針為pFoo,當(dāng)線程UserRoutine執(zhí)行完畢時(shí),釋放該對(duì)象。如圖2所示,是圖1中步驟S30中將線程函數(shù)中的對(duì)象指針插入到線程托管對(duì) 象鏈表的細(xì)化流程圖。線程函數(shù)通過調(diào)用函數(shù)ReleaseAtThreadQuitO將對(duì)象指針插 入到托管對(duì)象鏈表,之后執(zhí)行ReleaseAtThreadQuitO函數(shù)。在本較佳實(shí)施例中,所述 ReleaseAtThreadQuitO 函數(shù)代碼如下ECode CObjectReleaseAtThreadQuit (PInterface pObject)CList*pList ;{CThread: :GetTls0bject (TLS_AutoReleaseList, &pList) ;// 從 TLS 上獲得線 程托管對(duì)象鏈表If (pList == NULL){pList = new CList ;CThread::SetTlsObject(TLS_AutoReleaseList,pList);}pList-> Insert (pObject);return N0ERR0R ;}用圖2所示的流程描述上述構(gòu)建的代碼。步驟S301,聲明一個(gè)線程托管對(duì)象鏈表的類指針。具體而言,代碼為 CList^pList。步驟S302,通過所述聲明的類指針創(chuàng)建一個(gè)線程托管對(duì)象鏈表的類對(duì)象,實(shí)現(xiàn)一 個(gè)線程托管對(duì)象鏈表。具體而言,代碼為pList = new CList。步驟S303,將線程函數(shù)中的對(duì)象指針插入到線程托管對(duì)象鏈表,即完成了托管線 程函數(shù)中的對(duì)象。具體而言,代碼為pList-> Insert (pObject)。在本較佳實(shí)施例中,插入 的線程托管對(duì)象指針為PFoo。此外,由于線程函數(shù)的對(duì)象在第一次托管之后,線程托管對(duì)象鏈表已經(jīng)存在,當(dāng)線 程函數(shù)需要多個(gè)對(duì)象被托管時(shí),為保證每個(gè)線程中只有一個(gè)線程托管對(duì)象鏈表,可以直接 將線程函數(shù)中對(duì)象指針插入到已經(jīng)存在的線程托管對(duì)象鏈表中。具體做法為判斷線程托 管對(duì)象鏈表是否為空,若不為空,直接將對(duì)象指針插入到線程托管對(duì)象鏈表中。具體而言, 代碼如下
If (pList == NULL) {...}pList- > Insert(pEntry, pUserData)。如圖3所示,是圖1中步驟S40中調(diào)用線程托管對(duì)象鏈表中的對(duì)象指針的細(xì)化流 程圖。每個(gè)線程都有Thread Local Storage (TLS 線程本地存儲(chǔ))槽,占用一個(gè)TLS槽來 保存一個(gè)線程托管對(duì)象鏈表,當(dāng)線程即將結(jié)束的時(shí)候會(huì)自動(dòng)檢查這個(gè)鏈表,如果不為空則 遍歷它,并釋放每個(gè)成員對(duì)象,從而實(shí)現(xiàn)線程托管對(duì)象鏈表的調(diào)用。在本較佳實(shí)施例中,調(diào) 用線程托管對(duì)象鏈表代碼如下ECode CleanupList (){CThread::GetTlsObject(TLS_AutoReleaseList, &pList);If (pList == NULL){Return N0ERR0R ;}pHeader = pList ;pList = pList- > Prev();While (pList ! = pHeader) {//遍歷線程托管對(duì)象鏈表,并調(diào)用Release方法釋放 對(duì)象pList- > GetCurrent (&p0bj) ;//獲取線程托管對(duì)象鏈表當(dāng)前節(jié)點(diǎn)的對(duì)象指針pObj- > Release () ;//釋放被托管的對(duì)象pList = pList- > PrevO ;//繼續(xù)反向遍歷線程托管對(duì)象鏈表}Delete pList ;}用圖3所示的流程描述上述構(gòu)建的代碼。步驟S401,在線程函數(shù)的TLS槽中獲取線程托管對(duì)象鏈表。具體代碼為 CThread::GetTls0bject(TLS_AutoCallList, &pList)。步驟S402,判斷線程托管對(duì)象鏈表是否為空。具體代碼為If (pList = = NULL)。步驟S403,若線程托管對(duì)象鏈表是不為空,則遍歷線程托管對(duì)象鏈表,獲取線程托 管對(duì)象鏈表中的對(duì)象指針,通過獲取的對(duì)象指針釋放對(duì)象。在本較佳實(shí)施例子中,遍歷的方 式是反向遍歷線程托管對(duì)象鏈表,即按照倒序的方式依次讀取線程托管對(duì)象鏈表中的數(shù) 據(jù)。步驟S404,判斷線程托管對(duì)象鏈表是否遍歷完畢。步驟S405,若線程托管對(duì)象鏈表遍歷完畢,則刪除線程托管對(duì)象鏈表,之后流程結(jié) 束。具體代碼為Delete pList。在步驟S402中,若線程托管對(duì)象鏈表是為空,則直接結(jié)束流程。具體代碼為If (pList == NULL)
6
{Return N0ERR0R ;// 直接退出}在步驟S404中,若線程托管對(duì)象鏈表沒有遍歷完畢,則轉(zhuǎn)到步驟S403。最后所應(yīng)說明的是,以上實(shí)施例僅用以說明本發(fā)明的技術(shù)方案而非限制,盡管參 照以上較佳實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解,可以對(duì)本 發(fā)明的技術(shù)方案進(jìn)行修改或等同替換,而不脫離本發(fā)明技術(shù)方案的精神和范圍。
權(quán)利要求
一種線程托管對(duì)象的方法,其特征在于,該方法包括如下步驟步驟1,在主函數(shù)中創(chuàng)建一個(gè)線程;步驟2,執(zhí)行線程的入口函數(shù),在線程的入口函數(shù)中調(diào)用線程函數(shù);步驟3,將線程函數(shù)中的對(duì)象指針插入到線程托管對(duì)象鏈表;及步驟4,當(dāng)線程函數(shù)執(zhí)行完畢時(shí),調(diào)用線程托管對(duì)象鏈表中插入的對(duì)象指針,釋放對(duì)象,執(zhí)行結(jié)束。
2.如權(quán)利要求1所述的線程托管對(duì)象的方法,其特征在于,所述步驟3包括如下步驟 聲明一個(gè)線程托管對(duì)象鏈表的類指針;通過所述聲明的類指針創(chuàng)建一個(gè)線程托管對(duì)象鏈表的類對(duì)象,實(shí)現(xiàn)一個(gè)線程托管對(duì)象 鏈表;及將線程函數(shù)中的對(duì)象指針插入到線程托管對(duì)象鏈表中。
3.如權(quán)利要求2所述的線程托管對(duì)象的方法,其特征在于,所述線程托管對(duì)象鏈表存 放在該線程的線程本地存儲(chǔ)槽中。
4.如權(quán)利要求2所述的線程托管對(duì)象的方法,其特征在于,所述步驟4包括如下步驟 獲取線程托管對(duì)象鏈表;判斷線程托管托管對(duì)象鏈表是否為空;當(dāng)若線程托管對(duì)象鏈表不為空,遍歷線程托管對(duì)象鏈表,獲取線程托管對(duì)象鏈表中的 對(duì)象指針,并通過獲取的對(duì)象指針釋放對(duì)象;當(dāng)線程托管對(duì)象鏈表遍歷完畢,刪除線程托管對(duì)象鏈表;及 若線程托管對(duì)象鏈表為空,則執(zhí)行結(jié)束。
5.如權(quán)利要求4所述的線程托管對(duì)象的方法,其特征在于,所述遍歷的方式為反向遍歷。
全文摘要
一種線程托管對(duì)象的方法,該方法包括如下步驟步驟1,在主函數(shù)中創(chuàng)建一個(gè)線程;步驟2,執(zhí)行線程的入口函數(shù),在線程的入口函數(shù)中調(diào)用線程函數(shù);步驟3,將線程函數(shù)中的對(duì)象指針插入到線程托管對(duì)象鏈表;步驟4,當(dāng)線程函數(shù)執(zhí)行完畢時(shí),調(diào)用線程托管對(duì)象鏈表中插入的對(duì)象指針,釋放對(duì)象,執(zhí)行結(jié)束。利用本發(fā)明通過對(duì)象托管,可以在線程結(jié)束這一特殊時(shí)刻釋放對(duì)象,用戶就不必去檢查每個(gè)線程的退出點(diǎn),整個(gè)線程運(yùn)行期間不必?fù)?dān)心對(duì)象無效,也不用擔(dān)心對(duì)象遺漏釋放的情況,從而減輕用戶的負(fù)擔(dān)。
文檔編號(hào)G06F9/46GK101866298SQ200910049219
公開日2010年10月20日 申請(qǐng)日期2009年4月14日 優(yōu)先權(quán)日2009年4月14日
發(fā)明者宋世軍, 沈金, 陳榕 申請(qǐng)人:上??铺┦兰o(jì)科技有限公司