CreateThread函数
創(chuàng)建一個(gè)在調(diào)用進(jìn)程的虛擬地址空間內(nèi)執(zhí)行的線程。
要?jiǎng)?chuàng)建在另一個(gè)進(jìn)程的虛擬地址空間中運(yùn)行的線程,請(qǐng)使用 CreateRemoteThread函數(shù)。
語法
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,__drv_aliasesMem LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId );參數(shù)
- lpThreadAttributes
指向SECURITY_ATTRIBUTES 結(jié)構(gòu)的指針,該結(jié)構(gòu)確定子進(jìn)程是否可以繼承返回的句柄。如果 lpThreadAttributes為NULL,則無法繼承句柄。
結(jié)構(gòu)的lpSecurityDescriptor成員為新線程指定安全描述符。如果lpThreadAttributes為NULL,則線程獲取默認(rèn)安全描述符。線程的默認(rèn)安全描述符中的ACL來自創(chuàng)建者的主要標(biāo)志。
- dwStackSize
堆棧的初始大小,以字節(jié)為單位。系統(tǒng)將此值四舍五入到最近的頁面。如果此參數(shù)為零,則新線程使用可執(zhí)行文件的默認(rèn)大小。有關(guān)更多信息,請(qǐng)參閱線程堆棧大小。
- lpStartAddress
指向由線程執(zhí)行的應(yīng)用程序定義函數(shù)的指針。該指針表示線程的起始地址。有關(guān)線程函數(shù)的更多信息,請(qǐng)參見 ThreadProc
- lpParameter
指向要傳遞給線程的變量的指針。
- dwCreationFlags
控制線程創(chuàng)建的標(biāo)志。
| 0 | 該線程在創(chuàng)建后立即運(yùn)行。 |
| CREATE_SUSPENDEDs 0x00000004 | 線程是在掛起狀態(tài)下創(chuàng)建的,并且在調(diào)用ResumeThread函數(shù)之前不會(huì)運(yùn)行 。 |
| STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000在 | 所述dwStackSize參數(shù)指定堆棧的初始保留大小。如果未指定此標(biāo)志,則dwStackSize指定提交大小。 |
- lpThreadId
指向接收線程標(biāo)識(shí)符的變量的指針。如果此參數(shù)為 NULL,則不返回線程標(biāo)識(shí)符。
返回值
如果函數(shù)成功,則返回值是新線程的句柄。
如果函數(shù)失敗,則返回值為NULL。要獲取擴(kuò)展錯(cuò)誤信息,請(qǐng)調(diào)用 GetLastError。
請(qǐng)注意,即使lpStartAddress指向數(shù)據(jù),代碼或無法訪問,CreateThread也可能成功 。如果線程運(yùn)行時(shí)起始地址無效,則發(fā)生異常,并且線程終止。由于無效的起始地址導(dǎo)致的線程終止被視為線程進(jìn)程的錯(cuò)誤退出。此行為類似于CreateProcess的異步特性,即使它引用無效或缺少動(dòng)態(tài)鏈接庫(kù)(DLL),也會(huì)創(chuàng)建該進(jìn)程。
備注
進(jìn)程可以創(chuàng)建的線程數(shù)受可用虛擬內(nèi)存的限制。默認(rèn)情況下,每個(gè)線程都有一兆字節(jié)的堆棧空間。因此,您最多可以創(chuàng)建2,048個(gè)線程。如果減小默認(rèn)堆棧大小,則可以創(chuàng)建更多線程。但是,如果為每個(gè)處理器創(chuàng)建一個(gè)線程并構(gòu)建應(yīng)用程序隊(duì)列,應(yīng)用程序維護(hù)上下文信息,則應(yīng)用程序?qū)⒕哂懈玫男阅堋T谔幚硐乱粋€(gè)隊(duì)列中的請(qǐng)求之前,線程將處理隊(duì)列中的所有請(qǐng)求。
使用THREAD_ALL_ACCESS訪問權(quán)限創(chuàng)建新的線程句柄。如果在創(chuàng)建線程時(shí)未提供安全描述符,則使用創(chuàng)建線程的進(jìn)程的主令牌為新線程構(gòu)造默認(rèn)安全描述符。當(dāng)調(diào)用者嘗試使用OpenThread函數(shù)訪問該線程時(shí),將根據(jù)此安全描述符評(píng)估調(diào)用者的有效令牌以授予或拒絕訪問權(quán)限。
調(diào)用GetCurrentThread 函數(shù)時(shí),新創(chuàng)建的線程對(duì)自身具有完全訪問權(quán)限。
Windows Server 2003: 線程對(duì)自身的訪問權(quán)限是通過根據(jù)為線程構(gòu)造的默認(rèn)安全描述符評(píng)估創(chuàng)建線程的進(jìn)程的主令牌來計(jì)算的。如果在遠(yuǎn)程進(jìn)程中創(chuàng)建線程,則使用遠(yuǎn)程進(jìn)程的主令牌。因此,在調(diào)用GetCurrentThread時(shí),新創(chuàng)建的線程可能會(huì)減少對(duì)自身的訪問權(quán)限。某些訪問權(quán)限(包括THREAD_SET_THREAD_TOKEN和THREAD_GET_CONTEXT)可能不存在,從而導(dǎo)致意外故障。因此,建議不要在模仿其他用戶時(shí)創(chuàng)建線程。
如果線程是在可運(yùn)行狀態(tài)下創(chuàng)建的(即,如果未使用CREATE_SUSPENDED標(biāo)志),則線程可以在CreateThread返回之前開始運(yùn)行,特別是在調(diào)用者接收到創(chuàng)建的線程的句柄和標(biāo)識(shí)符之前。
線程執(zhí)行從lpStartAddress參數(shù)指定的函數(shù)開始。如果此函數(shù)返回,則DWORD返回值用于在對(duì)ExitThread函數(shù)的隱式調(diào)用中終止線程 。使用 GetExitCodeThread函數(shù)獲取線程的返回值。
創(chuàng)建的線程的線程優(yōu)先級(jí)為THREAD_PRIORITY_NORMAL。使用 GetThreadPriority和 SetThreadPriority函數(shù)來獲取和設(shè)置線程的優(yōu)先級(jí)值。
當(dāng)線程終止時(shí),線程對(duì)象獲得信號(hào)狀態(tài),滿足在對(duì)象上等待的任何線程。
線程對(duì)象保留在系統(tǒng)中,直到線程終止并且通過調(diào)用CloseHandle關(guān)閉了它的所有句柄。
ExitProcess, ExitThread, CreateThread, CreateRemoteThread的功能,以及正在啟動(dòng)的處理(如通過一個(gè)調(diào)用的結(jié)果 CreateProcess)的過程中是彼此之間串行化。這些事件中只有一個(gè)可以一次發(fā)生在地址空間中。這意味著以下限制包含:
在進(jìn)程啟動(dòng)和DLL初始化例程期間,可以創(chuàng)建新線程,但是在為進(jìn)程執(zhí)行DLL初始化之前它們不會(huì)開始執(zhí)行。
進(jìn)程中只有一個(gè)線程可以一次處于DLL初始化或分離例程中。
在DLL初始化或分離例程中沒有線程之前,ExitProcess不會(huì)完成。
調(diào)用C運(yùn)行時(shí)庫(kù)(CRT)的可執(zhí)行文件中的線程應(yīng)使用_beginthreadex和_endthreadex函數(shù)進(jìn)行線程管理,而不是 CreateThread和 ExitThread ; 這需要使用CRT的多線程版本。如果使用CreateThread創(chuàng)建的線程調(diào)用CRT,則CRT可以在低內(nèi)存條件下終止進(jìn)程。
Windows Phone 8.1: Windows Phone 8.1及更高版本上的Windows Phone應(yīng)用商店支持此功能。
Windows 8.1和Windows Server 2012 R2:Windows 8.1,Windows Server 2012 R2及更高版本上的Windows應(yīng)用商店應(yīng)用程序支持此功能。
例子
有關(guān)示例,請(qǐng)參閱 創(chuàng)建線程。
總結(jié)
以上是生活随笔為你收集整理的CreateThread函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python开发小型数据库_Python
- 下一篇: sqlyog如何设置.时提示字段名_雷神