既然 CreateThread 可以返回一個句柄, 說明線程屬於 "內核對象".
實際上不管線程屬於哪個進程, 它們在系統的懷抱中是平等的; 在優先級(後面詳談)相同的情況下, 系統會在相同的時間間隔內來運行一下每個線程, 不過這個間隔很小很小, 以至於讓我們誤以為程序是在不間斷地運行.
這時你應該有一個疑問: 系統在去執行其他線程的時候, 是怎麼記住前一個線程的數據狀態的?
有這樣一個結構 TContext, 它基本上是一個 CPU 寄存器的集合, 線程是數據就是通過這個結構切換的, 我們也可以通過 GetThreadContext 函數讀取寄存器看看.
附上這個結構 TContext(或叫: CONTEXT、_CONTEXT) 的定義:PContext = ^TContext;
_CONTEXT = record
ContextFlags: DWord;
Dr0: DWord;
Dr1: DWord;
Dr2: DWord;
Dr3: DWord;
Dr6: DWord;
Dr7: DWord;
FloatSave: TFloatingSaveArea;
SegGs: DWord;
SegFs: DWord;
SegEs: DWord;
SegDs: DWord;
Edi: DWord;
Esi: DWord;
Ebx: DWord;
Edx: DWord;
Ecx: DWord;
Eax: DWord;
Ebp: DWord;
Eip: DWord;
SegCs: DWord;
EFlags: DWord;
Esp: DWord;
SegSs: DWord;
end;
CreateThread 的最後一個參數是 "線程的 ID";
既然可以返回句柄, 為什麼還要輸出這個 ID? 現在我知道的是:
1、線程的 ID 是唯一的; 而句柄可能不只一個, 譬如可以用 GetCurrentThread 獲取一個偽句柄、可以用 DuplicateHandle 復制一個句柄等等.
2、ID 比句柄更輕便.
在主線程中 GetCurrentThreadId、MainThreadID、MainInstance 獲取的都是主線程的 ID.
啰哩啰嗦一大些, 才說了 CreateThread 一個參數, 下篇繼續.
線程的學習還在入門中, 把我的理解寫在這, 最期望的收獲是得到指正.