1. 線程 = 線程內核對象 + 線程棧
線程棧用於維護線程執行時所需的所有函數參數和局部變量
2. 線程共享同一地址空間,線程共享內核對象句柄,因爲句柄表是針對每一個進程的而不是針對線程的。
3. 進程所使用的系統資源更多。其原因在於地址空間。(爲一個進程創建一個虛擬的地址空間需要大量的系統資源,系統中會發生大量的記錄活動,而這需要大量的內存)
4. 所有窗口應該由同一個線程創建
實踐:用戶界面線程 + 受限於計算能力或IO的工作線程(永遠不創建窗口)
5. 線程函數應儘可能使用函數參數和局部變量。使用靜態變量和全局變量時,多個線程可以同時訪問這些變量。這樣可能破壞變量中保存的內容。
6. 新線程可以訪問進程內核對象的所有句柄、進程中的所有內存以及同一進程中其他所有線程的棧,這樣一來,同一個進程中的多個線程可以很容易地相互通信
7. 無窮遞歸會耗盡線程的棧
8. 一個線程有兩個用戶對象: 窗口和掛鉤。 一個線程終止時,系統會自動銷燬由線程創建或安裝的任何窗口。並卸載由線程創建或安裝的掛鉤。
9. 每個線程都有自己的一組cpu寄存器。 稱爲線程上下文(context)
上下文: 指令指針寄存器 IP
棧指針寄存器 SP
其它
10. p52
createthread(.... RtluserThreadStart, pvParam);
void RtlUserThreadStart ()
{
線程函數 <--------------- 線程不能退出此函數,始終在其內部消亡。
exitprocess
}
11. 使用_beginthreadex 而不是使用createThread p161