1、線程的組成
(1)、一個是線程的內(nèi)核對象,操作系統(tǒng)用它管理線程。內(nèi)核對象還是系統(tǒng)用來存放線程統(tǒng)計信息的地方。
(2)、一個線程堆棧,用于維護線程執(zhí)行時所需的所有函數(shù)參數(shù)和局部變量。
2、線程的運行
線程要在其進程的地址空間內(nèi)執(zhí)行代碼和處理數(shù)據(jù)。所以,假如一個進程上下文中有兩個以上的進程運行,這些線程將共享同一個地址空間。這些線程可以執(zhí)行同樣的代碼,可以處理相同的數(shù)據(jù)。此外,這些線程還共享內(nèi)核對象句柄,因為句柄表是針對每一個進程的,而不是針對每一個線程。
3、線程的創(chuàng)建、
(1)、如果應(yīng)用程序中有多個線程函數(shù),必須為它們指定不同的名稱,否則編譯器/鏈接器會認為你創(chuàng)建了一個函數(shù)的多個實現(xiàn)。
(2)、你的線程函數(shù)(實際就是你的所有函數(shù))應(yīng)該盡可能使用函數(shù)參數(shù)和局部變量。使用靜態(tài)和全局變量時,多個線程可以同時訪問這些變量,這樣可能會破壞變量中保存的內(nèi)容。然而,參數(shù)和局部變量是在線程堆棧上創(chuàng)建的。因此,不太可能被其他線程破壞。
(3)、使用CreateThread、_beginthreadex創(chuàng)建,沒什么好說的。
4、終止線程
(1)、線程函數(shù)返回(這是強烈推薦的)。
這是保證線程的所有資源都被正確清理的惟一方式。讓線程函數(shù)返回,可以確保以下正確的應(yīng)用程序清理工作都得以執(zhí)行:
?? 線程函數(shù)中創(chuàng)建的所有C++對象都通過其析構(gòu)函數(shù)被正確銷毀。
?? 操作系統(tǒng)正確釋放線程堆棧使用的內(nèi)存。
?? 操作系統(tǒng)把線程的退出代碼(在線程的內(nèi)核對象中維護)設(shè)為線程函數(shù)的返回值。
?? 系統(tǒng)遞減少線程的內(nèi)核對象的使用計數(shù)。
(2)、線程通過調(diào)用ExitThread函數(shù)“殺死”自己(要避免使用這種方法)。
導(dǎo)致操作系統(tǒng)清理該線程使用的所有操作系統(tǒng)資源。但是,你的C/C++資源(如C++類對象)不會被銷毀。
(3)、同一個進程或另一個進程中的線程調(diào)用TerminateThread函數(shù)(要避免使用這種方法)。
TerminateThread函數(shù)是異步的。也就是說,它告訴系統(tǒng)你想終止線程,但在函數(shù)返回時,并不
保證線程已經(jīng)終止了。如果需要確定線程已終止運行,還需要調(diào)用WaitForSingleObject。
(4)、包含線程的進程終止運行(這種方法避免使用)。
ExitProcess和TerminateProcess函數(shù)也可用于終止線程的運行。區(qū)別在于,這些函數(shù)會使終止運行的進程中的所有線程全部終止。同時,由于整個進程都會關(guān)閉,所以它所使用的所有資源肯定都會被清理。其中必然包括所有線程的堆棧。這兩個函數(shù)會導(dǎo)致進程中剩余的所有線程被強行“殺死”,這就好象是我們?yōu)槭S嗟拿總€線程都調(diào)TerminateThread。
顯然,這意味著正確的應(yīng)用程序清理工作不會執(zhí)行:C++對象的析構(gòu)函數(shù)不會被調(diào)用,數(shù)據(jù)不會回寫到磁盤……等等。
正如我在本章開始就解釋的一樣,當應(yīng)用程序的入口函數(shù)返回時,C/C+運行庫的啟動代碼將調(diào)用ExitProcess。因此,如果應(yīng)用程序中并發(fā)運行著多個線程,你需要在主線程返回之前,顯式地處理好每個線程的終止過程。否則,其他所有正在運行的線程都會在毫無預(yù)警的前提下突然“死亡”。
posted on 2011-10-07 23:10
Yu_ 閱讀(263)
評論(0) 編輯 收藏 引用 所屬分類:
Windows程序設(shè)計