CreateThread是一種微軟在Windows API中提供了建立新的執行緒的函式,該函式在主執行緒的基礎上創建一個新執行緒。執行緒終止運行後,執行緒對象仍然在系統中,必須通過CloseHandle函式來關閉該執行緒對象。
需要調用到CRT庫時,不要用CreateThread 創建執行緒、並用CloseHandle來關閉這個執行緒,而應該用_beginthread來創建執行緒,_endthread來銷毀執行緒。因為沒有對子執行緒為CRT庫分配堆,會導致低記憶體錯誤而崩潰。
CreateThread 不會判斷lpStartAddr是數據還是代碼,甚至不會判斷是否有足夠的訪問許可權。lpStartAddr可以未必是個函式,也可以是類成員,只要將函式指針強制轉換,並且不產生棧溢出和沒有訪問許可權的問題就以及類如未定義的指令之類的錯誤可以順利執行執行緒。創建類成員函式的對象時,this指針是調用CreateThread時所處的類對象的指針。在類對象外調用,其this指針將是未知的。
基本介紹
- 中文名:CreateThread
- 外文名:CreateThread
- 聲明位置:processthreadsapi.h
- 返回值類型:HANDLE
- 調用方式:__stdcall
步驟
函式原型
參數說明
記憶體泄漏
HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,//執行緒安全屬性DWORDdwStackSize,//堆疊大小LPTHREAD_START_ROUTINElpStartAddress,//執行緒函式LPVOIDlpParameter,//執行緒參數DWORDdwCreationFlags,//執行緒創建屬性LPDWORDlpThreadId//執行緒ID);
示例
#include <windows.h>#include <strsafe.h>//win2003SDK必須安裝 要不無此頭檔案。此檔案是為了實現StringCchPrintf,StringCchLength。#define MAX_THREADS 3#define BUF_SIZE 255typedef struct _MyData{int val1;int val2;}MYDATA,*PMYDATA;DWORD WINAPI ThreadProc(LPVOID lpParam){ HANDLE hStdout; PMYDATA pData; TCHAR msgBuf[BUF_SIZE]; size_tcchStringSize; DWORD dwChars; hStdout=GetStdHandle(STD_OUTPUT_HANDLE); if(hStdout==INVALID_HANDLE_VALUE) return 1; //Cast the parameter to the correct data type. pData=(PMYDATA)lpParam; //Print the parameter values using thread-safe functions. StringCchPrintf(msgBuf,BUF_SIZE,TEXT("Parameters=%d,%d\n"), pData->val1,pData->val2); StringCchLength(msgBuf,BUF_SIZE,&cchStringSize); WriteConsole(hStdout,msgBuf,cchStringSize,&dwChars,NULL); //Free the memory allocated by the caller for the thread //data structure. HeapFree(GetProcessHeap(),0,pData); return 0;}void main(){ PMYDATA pData; DWORD dwThreadId[MAX_THREADS]; HANDLE hThread[MAX_THREADS]; int i; //Create MAX_THREADS worker threads. for(i = 0; i < MAX_THREADS; i++) { //Allocate memory for thread data. pData=(PMYDATA)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, sizeof(MYDATA)); if(pData==NULL) ExitProcess(2); //Generate unique data for each thread. pData->val1=i; pData->val2=i+100; hThread[i]=CreateThread( NULL,//default security attributes 0,//use default stack size ThreadProc,//thread function pData,//argument to thread function 0,//use default creation flags &dwThreadId[i]);//returns the thread identifier //Check there turn value for success. if(hThread[i]==NULL) { ExitProcess(i); } } //Wait until all threads have terminated. WaitForMultipleObjects(MAX_THREADS,hThread,TRUE,INFINITE); //Close all thread handle supon completion. for(i=0;i<MAX_THREADS;i++) { CloseHandle(hThread[i]); } }
