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