CreateThread 函式 (processthreadsapi.h)
建立線程,以在呼叫進程的虛擬位址空間內執行。
若要建立在另一個進程的虛擬位址空間中執行的線程,請使用 createRemoteThread 函式
語法
HANDLE CreateThread(
[in, optional] LPSECURITY_ATTRIBUTES lpThreadAttributes,
[in] SIZE_T dwStackSize,
[in] LPTHREAD_START_ROUTINE lpStartAddress,
[in, optional] __drv_aliasesMem LPVOID lpParameter,
[in] DWORD dwCreationFlags,
[out, optional] LPDWORD lpThreadId
);
參數
[in, optional] lpThreadAttributes
SECURITY_ATTRIBUTES 結構的指標,決定傳回的句柄是否可以由子進程繼承。 如果 lpThreadAttributes 為 NULL,則無法繼承句柄。
lpSecurityDescriptor 結構的成員會指定新線程的安全性描述元。 如果 lpThreadAttributes 為 NULL,線程會取得預設的安全性描述元。 線程的預設安全性描述元中的 ACL 來自建立者的主要令牌。
[in] dwStackSize
堆疊的初始大小,以位元組為單位。 系統會將此值四捨五入至最接近的頁面。 如果此參數為零,新線程會使用可執行文件的預設大小。 如需詳細資訊,請參閱 線程堆疊大小。
[in] lpStartAddress
線程所要執行之應用程式定義函式的指標。 此指標代表線程的起始位址。 如需線程函式的詳細資訊,請參閱 ThreadProc。
[in, optional] lpParameter
要傳遞至線程之變數的指標。
[in] dwCreationFlags
控制線程建立的旗標。
價值 | 意義 |
---|---|
|
線程會在建立後立即執行。 |
|
線程是以暫止狀態建立,而且在呼叫 resumeThread 函式 |
|
dwStackSize 參數會指定堆疊的初始保留大小。 如果未指定此旗標,dwStackSize 指定認可大小。 |
[out, optional] lpThreadId
接收線程標識碼之變數的指標。 如果此參數 NULL,則不會傳回線程標識符。
傳回值
如果函式成功,傳回值就是新線程的句柄。
如果函式失敗,則傳回值 NULL。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。
請注意,即使 lpStartAddress 指向數據、程式代碼或無法存取,CreateThread 仍可能會成功。 如果線程執行時啟動位址無效,就會發生例外狀況,而線程會終止。 線程因無效的啟動位址而終止線程,會以線程進程的錯誤結束處理。 此行為類似於 CreateProcess的異步本質,即使它參考無效或遺失的動態連結庫 (DLL),也會建立進程。
言論
進程可以建立的線程數目受限於可用的虛擬記憶體。 根據預設,每個線程都有一 MB 的堆疊空間。 因此,您無法在沒有 /3GB
boot.ini 選項的情況下,在 32 位系統上建立 2,048 個以上的線程。 如果您減少預設堆疊大小,您可以建立更多線程。 不過,如果您為每個處理器建立一個線程,並建置應用程式維護內容資訊的要求佇列,您的應用程式將會有較佳的效能。 線程會先處理佇列中的所有要求,再處理下一個佇列中的要求。
新的線程句柄是使用 THREAD_ALL_ACCESS 存取權建立的。 如果建立線程時未提供安全性描述元,則會使用正在建立線程之進程的主要令牌,為新線程建構預設的安全性描述元。 當呼叫端嘗試使用 OpenThread 函式存取線程時,會根據這個安全性描述元評估呼叫端的有效令牌,以授與或拒絕存取權。
新建立的線程在呼叫 getCurrentThread 函式時,具有本身的完整訪問許可權。
Windows Server 2003:線程本身的訪問許可權是透過評估線程針對為線程建構的預設安全性描述元所建立之進程的主要令牌來計算。 如果在遠端進程中建立線程,則會使用遠程進程的主要令牌。 因此,在呼叫 getCurrentThread 時,新建立的線程可能會降低自己的訪問許可權。 某些訪問許可權,包括 THREAD_SET_THREAD_TOKEN 和 THREAD_GET_CONTEXT 可能不存在,導致非預期的失敗。 基於這個理由,不建議在模擬其他使用者時建立線程。
如果線程是以可執行狀態建立的(也就是未使用 CREATE_SUSPENDED 旗標),線程可以在 CreateThread 傳回之前開始執行,特別是呼叫端收到所建立線程的句柄和標識符之前。
線程執行會從 lpStartAddress 參數指定的函式開始。 如果此函式傳回,則會使用 DWORD 傳回值來終止 ExitThread 函式的隱含呼叫中的線程。 使用 GetExitCodeThread 函式來取得線程的傳回值。
線程會以線程優先順序建立,THREAD_PRIORITY_NORMAL。 使用 GetThreadPriority 和 SetThreadPriority 函式來取得和設定線程的優先順序值。
當線程終止時,線程物件會取得訊號狀態,滿足正在等候物件的任何線程。
線程物件會保留在系統中,直到線程終止,而且所有句柄都透過呼叫關閉,CloseHandle。
ExitProcess、ExitThread、CreateThread、CreateRemoteThread 函式,以及啟動的進程(CreateProcess呼叫的結果)會在進程內彼此串行化。 一次只能在位址空間中發生其中一個事件。 這表示下列限制會保留:
- 在進程啟動和 DLL 初始化例程期間,可以建立新的線程,但在進程完成 DLL 初始化之前,它們才會開始執行。
- 進程中只有一個線程可以在 DLL 初始化中,或一次中斷連結例程。
- ExitProcess 不會完成,直到其 DLL 初始化或中斷連結例程中沒有線程為止。
Windows Phone 8.1: Windows Phone 8.1 和更新版本的 Windows Phone 市集應用程式支援此功能。
Windows 8.1 和 Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 和更新版本上支援 Windows 市集應用程式。
例子
如需範例,請參閱 建立線程。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | Windows XP [傳統型應用程式 |UWP 應用程式] |
支援的最低伺服器 | Windows Server 2003 [傳統型應用程式 |UWP 應用程式] |
目標平臺 | 窗戶 |
標頭 | processthreadsapi.h (包括 Windows Server 2003 上的 Windows.h、Windows Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2) |
連結庫 | Kernel32.lib;Windows Phone 8.1 上的 WindowsPhoneCore.lib |
DLL | Kernel32.dll;Windows Phone 8.1 上的 KernelBase.dll |