CreateThread创建线程函数详细讲解
CreateThread
CreateThread函數(shù)創(chuàng)建一個(gè)要在調(diào)用進(jìn)程的地址空間中執(zhí)行的線程。(MSDN講解如下)
實(shí)例: m_hSendThread = CreateThread(NULL,0,SendThread,this,0,&m_dwSendThreadID);
倒數(shù)第二個(gè)參數(shù)為0表示線程創(chuàng)建后立即運(yùn)行
最后一個(gè)參數(shù)不為空,表示運(yùn)行后有返回值
參數(shù)
lpThreadAttributes
指向SECURITY_ATTRIBUTES結(jié)構(gòu)的指針,該結(jié)構(gòu)決定子進(jìn)程是否可以繼承返回的句柄。如果lpThreadAttributes為空,則不能繼承句柄。
結(jié)構(gòu)的lpSecurityDescriptor成員為新線程指定一個(gè)安全描述符。如果lpThreadAttributes為空,線程將獲得一個(gè)默認(rèn)的安全描述符。
dwStackSize
指定堆棧的初始提交大小,以字節(jié)為單位。系統(tǒng)將這個(gè)值舍入到最近的頁(yè)面。如果此值為零,或者小于默認(rèn)的提交大小,則默認(rèn)情況下使用與調(diào)用線程相同的大小。有關(guān)更多信息,請(qǐng)參見線程堆棧大小。
lpStartAddress
指向由線程執(zhí)行的類型為lpthread_start_例程的應(yīng)用程序定義的函數(shù)的指針,并表示線程的起始地址。有關(guān)thread函數(shù)的更多信息,請(qǐng)參見ThreadProc。
lpParameter
指定傳遞給線程的單個(gè)32位參數(shù)值。
dwCreationFlags
指定控制線程創(chuàng)建的附加標(biāo)志。如果指定了CREATE_SUSPENDED標(biāo)志,則線程將以掛起狀態(tài)創(chuàng)建,并且在調(diào)用ResumeThread函數(shù)之前不會(huì)運(yùn)行。如果該值為零,則線程在創(chuàng)建后立即運(yùn)行。此時(shí),不支持其他值。
lpThreadId
指向接收線程標(biāo)識(shí)符的32位變量的指針。
如果該參數(shù)為空,則不返回線程標(biāo)識(shí)符。
Windows 95和Windows 98:此參數(shù)可能不為空。
返回值
如果函數(shù)成功,則返回新線程的句柄。
如果函數(shù)失敗,返回值為NULL。要獲取擴(kuò)展的錯(cuò)誤信息,請(qǐng)調(diào)用GetLastError。
只有在32位程序的上下文中調(diào)用CreateThread時(shí)才會(huì)成功。當(dāng)16位程序調(diào)用一個(gè)32位DLL時(shí),該DLL不能創(chuàng)建額外的線程。
講話
使用THREAD_ALL_ACCESS創(chuàng)建新線程句柄。如果沒有提供安全描述符,則可以在需要線程對(duì)象句柄的任何函數(shù)中使用該句柄。當(dāng)提供安全描述符時(shí),將在授予訪問權(quán)之前對(duì)句柄的所有后續(xù)使用執(zhí)行訪問檢查。如果訪問檢查拒絕訪問,請(qǐng)求進(jìn)程就不能使用句柄來訪問線程。
線程執(zhí)行從lpStartAddress參數(shù)指定的函數(shù)開始。如果此函數(shù)返回,則使用DWORD返回值終止對(duì)ExitThread函數(shù)的隱式調(diào)用中的線程。使用GetExitCodeThread函數(shù)獲取線程的返回值。
即使lpStartAddress指向數(shù)據(jù)、代碼或不可訪問,CreateThread函數(shù)也可能成功。如果線程運(yùn)行時(shí)起始地址無效,則發(fā)生異常,線程終止。由于無效的開始地址而導(dǎo)致的線程終止將作為線程進(jìn)程的錯(cuò)誤退出處理。這種行為類似于CreateProcess的異步本質(zhì),即使它引用無效或缺少動(dòng)態(tài)鏈接庫(kù)(dll),也會(huì)創(chuàng)建進(jìn)程。
線程的優(yōu)先級(jí)是THREAD_PRIORITY_NORMAL。使用GetThreadPriority和SetThreadPriority函數(shù)來獲取和設(shè)置線程的優(yōu)先級(jí)值。
當(dāng)一個(gè)線程終止時(shí),線程對(duì)象達(dá)到一個(gè)有信號(hào)狀態(tài),滿足任何正在等待該對(duì)象的線程。
線程對(duì)象一直保留在系統(tǒng)中,直到線程終止,并且通過調(diào)用CloseHandle關(guān)閉了對(duì)它的所有句柄。
ExitProcess、ExitThread、CreateThread、CreateRemoteThread函數(shù)和正在啟動(dòng)的進(jìn)程(作為CreateProcess調(diào)用的結(jié)果)在一個(gè)進(jìn)程內(nèi)彼此序列化。在地址空間中一次只能發(fā)生一個(gè)事件。這意味著以下限制仍然有效:
在進(jìn)程啟動(dòng)和DLL初始化過程中,可以創(chuàng)建新線程,但是在進(jìn)程完成DLL初始化之前,它們不會(huì)開始執(zhí)行。
一個(gè)進(jìn)程中一次只能有一個(gè)線程處于DLL初始化或分離例程中。
ExitProcess直到?jīng)]有線程在其DLL初始化或分離例程時(shí)才返回。
使用C運(yùn)行庫(kù)函數(shù)的線程應(yīng)該使用beginthread和endt
總結(jié)
以上是生活随笔為你收集整理的CreateThread创建线程函数详细讲解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VC 6.0中添加库文件和头文件
- 下一篇: Windows API之WriteFil