windows平臺主線程退出後對子線程的影響

1.進程與主線程:
首先得明確一點,我理解的進程是一個exe文件運行之後的獨立資源,每個進程有且僅有一個主線程,進程是負責分配資源的,線程是負責執行資源的(一般可以認爲線程的執行時間就是線程調度函數的運行時間),相當於進程是包工頭,線程是幹活的工人,在後文裏,不做特殊說明,子線程統一都是由主線程直接或間接創建的。

2.主線程結束後,其它子線程是立刻退出還是繼續執行?
答案:主線程退出可能會間接導致子線程退出!但不會直接導致子線程退出!
因爲主線程退出分兩種情況:
(1) 不對主線程做任何特殊處理,當其正常結束後,主進程也會結束,從而間接導致其它子線程的執行資源被回收,子線程也全部結束運行。

我自己做了一個測試來驗證這個結果,創建線程的屬性也基本是項目裏常用的,代碼如下,主函數就是主線程的執行資源,地球人都知道,就不囉嗦了:
在這裏插入圖片描述

對於這個代碼,主線程肯定是比子線程先退出的,它執行10秒,其它的子線程執行40秒,配合任務管理器來觀察,如果”主線程”文字打印完之後,控制檯直接關閉而不是繼續等待,並且任務管理器裏的進程也結束了,那就說明之前的推論是正確的,下面是運行之後的情況;

程序剛運行時,控制檯和任務管理器如下:
在這裏插入圖片描述

10秒過後,控制檯消失,任務管理器裏也沒有”ClassTest”進程了:
在這裏插入圖片描述
這種情況下,主線程正常退出後,其它子線程也不能執行了!

(2) 調用API去關閉主線程時,主進程不會退出,其它子線程會正常執行。
在這裏插入圖片描述
對於上面的代碼,運行時的截圖跟之前一樣,但是主線程是被API結束的,不是正常退出,10秒過後,控制檯沒有退出,任務管理器裏”ClassTest”進程還在,線程數量減少,說明三個子線程還在:
在這裏插入圖片描述
3. 子線程退出是否會互相影響?
答案是不會,有一點得明確,假如線程A創建了線程B,它倆就是單獨的兩個線程了,A的退出不會影響B,B的退出也不會影響A。可以理解爲工地的工人工作量太大,他可以另外拉一個工人(線程)來幫自己幹活,工資還是由包工頭(主進程)來負責;就像我們組老大(子線程A)只負責拉我(子線程B)來幹活,但是工資是老闆 (主進程)來發。

綜上所述:
(1) 主線程的退出對其它線程並沒有直接影響;主線程被提前強制結束時,不會導致進程退出,其他子線程會正常執行;主線程正常結束時,會導致進程退出,從而回收進程資源,其他子線程也都退出(這種現象看起來像是主線程直接導致子線程結束,不能弄混了)。
(2) 子線程退出不會對別的線程直接造成影響,因爲主進程還在,只不過可能因爲數據共享等問題給別的線程造成一些麻煩。

By the way:
很多人用VS測試的時候,會在主函數末尾加上system(“pause”)或getchar()不讓控制檯結束,我想了想,做這個測試的時候不能用這兩個方法,因爲它們會導致主線程阻塞,那這樣一來主線程不退出,這個測試就沒法做了……我剛開始就是犯了這個錯誤….

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章