官术网_书友最值得收藏!

3.1 線程的基本概念及常見問題

提到線程,就不得不提到進程。一個進程代表計算機中實際運行的一個程序。在現代操作系統的保護模式下,每個進程都擁有自己獨立的進程地址空間和上下文堆棧。但就一個程序本身執行的操作來說,進程其實什么也不做(不執行任何進程代碼),只提供一個大環境容器,進程中的實際執行體是線程(thread)。因此在一個進程中至少得有一個線程,我們把這個線程稱為“主線程”。

通俗地說,線程是進程中實際執行代碼的最小單元,由操作系統安排調度(何時啟動、運行、暫停及消亡)。

這里重點強調我們在實際開發中使用多線程時需要弄明白的問題。

3.1.1 主線程退出,支線程也將退出嗎

在 Windows 系統中,當一個進程存在多個線程時,如果主線程執行結束,那么這時支線程(也可以叫工作線程)即使還沒有執行完相關代碼,也會退出。也就是說,主線程一旦退出,整個進程也就結束了。之所以強調這一點,是因為很多初學者經常在工作線程中寫了很多邏輯代碼,但沒有注意到主線程已經提前退出,導致這些工作線程的代碼來不及執行。解決這一問題的方案有很多,核心是讓主線程不退出,或者主線程至少在工作線程完成工作之前不要退出。常見的解決方案有讓主線程啟動一個循環或者主線程等待工作線程退出后再退出。

在 Linux 系統中,如果主線程退出,則工作線程一般不會受到影響,還會繼續運行,但此時這個進程就會變成僵尸進程。這是一種不好的做法,在實際開發中應該避免產生僵尸進程。

使用ps-ef 命令查看系統進程列表時,帶有<defunct>字樣的進程即僵尸進程:

Linux版本眾多,在某些Linux版本的實現中,主線程退出也會導致支線程退出,這就和在 Windows 上的行為一樣了。我們在實際開發中應以自己的機器測試結果為準。

3.1.2 某個線程崩潰,會導致進程退出嗎

這是一道常見的面試題,還有一種問法是:進程中的某個線程崩潰,是否會對其他線程造成影響?

一般來說,每個線程都是獨立執行的單位,都有自己的上下文堆棧,一個線程崩潰不會對其他線程造成影響。但是在通常情況下,一個線程崩潰也會導致整個進程退出。例如在Linux操作系統中可能會產生一個Segment Fault錯誤,這個錯誤會產生一個信號,操作系統對這個信號的默認處理就是結束進程,這樣整個進程都被銷毀,在這個進程中存在的其他線程自然也就不存在了。

主站蜘蛛池模板: 额敏县| 敖汉旗| 唐山市| 淄博市| 西盟| 明光市| 通海县| 工布江达县| 潍坊市| 湄潭县| 怀仁县| 资兴市| 凉山| 乌拉特中旗| 榆林市| 和硕县| 慈利县| 孟州市| 东莞市| 龙岩市| 天全县| 瑞金市| 黄山市| 乐亭县| 琼海市| 保康县| 万宁市| 淮滨县| 海丰县| 内黄县| 柘荣县| 万州区| 公主岭市| 大同县| 遵化市| 西林县| 宁海县| 平罗县| 那坡县| 和田市| 上犹县|