線程概述
理解線程是很重要的,因爲進程的執行至少需要一個線程。本章會詳細討論線程,包括線程和進程之間的區別和各自的任務、線程內核對象及其屬性、操作線程內核對象的各種方法、在進程內創建線程的方法等。
在第四章“進程”中,我們說過進程實際上由兩部分組成:進程內核對象和進程地址空間。類似的,線程也包括兩個部分:
- 線程內核對象:用於操作系統用於管理線程、存儲線程統計信息
- 線程棧:存儲線程執行時的所有函數參數和局部變量。第16章“線程棧”將進一步解釋操作系統如何管理線程棧
進程是惰性的——它從不執行任何代碼,它只是線程的容器。線程總是在某個進程環境中被創建、運行並且終止,也就是說線程在進程地址空間中執行代碼、操作數據,因此進程中的多個線程將共享進程地址空間中的數據,包括進程的句柄表。
進程會消耗許多系統資源,這是因爲進程需要地址空間。操作系統管理進程地址空間時需要保持大量的記錄並消耗可觀的內存,另外向進程地址空間載入dll和exe文件也會消耗一定的文件資源。與進程相比,線程消耗的系統資源非常有限——它僅僅需要一個內核對象和一個棧。因爲使用線程的開銷比較小,解決多任務問題時你應該儘量選擇使用多線程而不是多進程。但是,這並不是金科玉律,有些情況使用進程會更好些,這需要設計者的權衡。
在揭示線程本質之前,讓我們花一點時間來討論如何在應用程序中正確的使用線程。