Share via


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

控制線程建立的旗標。

意義
0
線程會在建立之後立即執行。
CREATE_SUSPENDED
0x00000004
線程會以暫停狀態建立,而且在呼叫 ResumeThread 函式之前不會執行。
STACK_SIZE_PARAM_IS_A_RESERVATION
0x00010000
dwStackSize 參數會指定堆疊的初始保留大小。 如果未指定此旗標, dwStackSize 會指定認可大小。

[out, optional] lpThreadId

接收線程標識碼之變數的指標。 如果此參數為 NULL,則不會傳回線程標識碼。

傳回值

如果函式成功,則傳回值是新線程的句柄。

如果函式失敗,則傳回值為 NULL。 若要取得擴充的錯誤資訊,請呼叫 GetLastError

請注意,即使 lpStartAddress 指向數據、程式代碼或無法存取,CreateThread 還是可能會成功。 如果線程執行時啟動位址無效,就會發生例外狀況,而線程會終止。 線程因無效的啟動位址而終止,會當做線程進程的錯誤結束處理。 此行為類似於 CreateProcess 的異步本質,即使進程參考無效或遺漏動態連結庫 (,) DLL 也是如此。

備註

進程可建立的線程數目受限於可用的虛擬記憶體。 根據預設,每個線程都有一 MB 的堆疊空間。 因此,您無法在沒有 boot.ini 選項的情況下 /3GB ,在 32 位系統上建立 2,048 個以上的線程。 如果您減少預設堆疊大小,您可以建立更多線程。 不過,如果您為每個處理器建立一個線程,並建置應用程式維護內容資訊的要求佇列,您的應用程式將會有更好的效能。 線程會在處理下一個佇列中的要求之前,先處理佇列中的所有要求。

新的線程句柄是使用存取權 THREAD_ALL_ACCESS 建立。 如果建立線程時未提供安全性描述元,則會使用建立線程之進程的主要令牌,為新線程建構預設的安全性描述元。 當呼叫端嘗試使用 OpenThread 函式存取線程時,會根據此安全性描述元評估呼叫端的有效令牌,以授與或拒絕存取權。

新建立的線程在呼叫 GetCurrentThread 函式時,本身具有完整的訪問許可權。

Windows Server 2003: 線程本身的訪問許可權是藉由評估針對線程所建構的預設安全性描述元所建立之進程的主要令牌來計算。 如果在遠端進程中建立線程,則會使用遠程進程的主要令牌。 因此,新建立的線程在呼叫 GetCurrentThread 時,本身的存取權可能會降低。 某些訪問許可權,包括 THREAD_SET_THREAD_TOKENTHREAD_GET_CONTEXT 可能不存在,導致非預期的失敗。 基於這個理由,不建議在模擬其他使用者時建立線程。

如果線程是以可執行狀態建立, (也就是說,如果未使用 CREATE_SUSPENDED 旗標) ,則線程可以在 CreateThread 傳回之前開始執行,特別是呼叫端收到所建立線程的句柄和標識符之前開始執行。

線程執行會從 lpStartAddress 參數指定的函式開始。 如果此函式傳回, 則會使用 DWORD 傳回值,在 ExitThread 函式的隱含呼叫中終止線程。 使用 GetExitCodeThread 函式來取得線程的傳回值。

線程是以 線程優先順序建立的THREAD_PRIORITY_NORMAL。 使用 GetThreadPrioritySetThreadPriority 函式來取得和設定線程的優先順序值。

當線程終止時,線程物件會取得訊號狀態,滿足正在等候物件的任何線程。

線程物件會保留在系統中,直到線程終止且所有句柄都透過對 CloseHandle 的呼叫關閉為止。

ExitProcessExitThread、CreateThreadCreateRemoteThread 函式,以及因為 CreateProcess) 呼叫而啟動 (的進程會在進程內彼此串行化。 一次位址空間中只能發生其中一個事件。 這表示下列限制會保留:

  • 在進程啟動和 DLL 初始化例程期間,可以建立新的線程,但在進程完成 DLL 初始化之前,它們不會開始執行。
  • 進程中只有一個線程可以一次位於 DLL 初始化或中斷連結例程中。
  • ExitProcess 在 DLL 初始化或中斷連結例程中沒有線程之前,才會完成。
可執行檔中呼叫 C 運行時間連結庫 (CRT) 的線程應該使用 線程管理_beginthreadex_endthreadex 函式,而不是 CreateThreadExitThread;這需要使用CRT的多線程版本。 如果使用 CreateThread 建立的線程呼叫 CRT,CRT 可能會以低記憶體狀況終止進程。

Windows Phone 8.1:Windows Phone 8.1 和更新版本上的 Windows Phone Store 應用程式支援此函式。

Windows 8.1Windows Server 2012 R2:Windows 市集應用程式支援 Windows 8.1、Windows Server 2012 R2 和更新版本。

範例

如需範例,請參閱 建立線程

規格需求

需求
最低支援的用戶端 Windows XP [傳統型應用程式 |UWP 應用程式]
最低支援的伺服器 Windows Server 2003 [傳統型應用程式 |UWP 應用程式]
目標平台 Windows
標頭 processthreadsapi.h (Windows Server 2003、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

另請參閱

CloseHandle

CreateProcess

CreateRemoteThread

ExitProcess

ExitThread

GetExitCodeThread

GetThreadPriority

處理序和執行緒函式

ResumeThread

SECURITY_ATTRIBUTES

SetThreadPriority

SuspendThread

ThreadProc

執行緒