本文系統梳理 CreateThread 完整參數列表,重點剖析返回值「線程句柄」與輸出參數「線程 ID」的本質差異、內核對象安全模型、線程上下文切換結構 TContext,並揭示 ExitThread 在主線程與 TThread 中的使用陷阱。
function CreateThread(
lpThreadAttributes: Pointer; { 安全屬性 }
dwStackSize: DWORD; { 堆疊大小 }
lpStartAddress: TFNThreadStartRoutine; { 入口函數 }
lpParameter: Pointer; { 函數參數 }
dwCreationFlags: DWORD; { 啟動選項 }
var lpThreadId: DWORD { 輸出線程 ID }
): THandle; stdcall; { 返回線程句柄 }
Delphi TThread.Create → BeginThread → CreateThread 層層封裝。
procedure TForm1.Button1Click(Sender: TObject);
begin ExitThread(0); { 直接退出主線程,進程隨之終止 } end;
CreateThread 入口函數執行完自動退出,無需 ExitThread。TThread 分配了額外資源(成員變數、TObject 基礎結構),若用 ExitThread 強制退出會導致記憶體洩漏。Delphi 提供 EndThread 但同樣不建議手動調用——你很難知道線程何時真正跑完。| 特性 | 句柄 | ID |
|---|---|---|
| 本質 | 內核對象引用(不透明指標) | 系統唯一數值標識符 |
| 唯一性 | 可複製(DuplicateHandle)、偽句柄(GetCurrentThread) | 全系統唯一,不可重複 |
| 輕量度 | 含權限、引用計數等 | 單純 32 位整數,更輕便 |
| 取得主線程 | GetCurrentThread(偽句柄) | GetCurrentThreadId、MainThreadID |