HANDLE CreateThread(
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
//SECURITY_ATTRIBUTES結構指定了這個線程的安全屬性,如果填NULL則就以默認的安全描述子創建,並且返回的句柄不會被繼承。
_In_SIZE_T dwStackSize,
//線程的堆棧大小(單位是字節),如果為0則默認和主線程一樣大。堆棧再進程的內存空間內自動分配並在進程結束時釋放。如有必要堆棧大小可以增加。
//CreateThread在試圖分配大小為dwAtackSize字節數的內存,並在可用內存不足時返回失敗消息。
_In_LPTHREAD_START_ROUTINE lpStartAddress,
//指向線程所需要執行的應用程序提供的函數,同時這也代表線程開始的地址。函數接受一個32位的參數並返回一個32位值
_In_opt_ __drv_aliasesMem LPVOID lpParameter,
//指定一個傳遞給線程的32位參數值
_In_DWORD dwCreationFlags,
//指定一個附加標志來控制線程的創建。如果CREATE_SUSPENDED標志被定義,線程就以掛起狀態創建,即直到ResumeThread()函數被調用之前都不執行
//如果該值為0,線程在創建後立即開始執行
_Out_opt_ LPDWORD lpThreadId
//指向一個保存線程的ID,32位變量
)
如果執行成功,其返回值是指向下一個新線程的句柄。如果失敗,將返回NULL。
當執行完一個線程後,應該關閉該線程的句柄。CloseHandle(),該函數使用CreateThread()返回點句柄,並將對應內核對象的引用計數器加減1。
這並不是強制關閉一個線程,而是告訴系統改線程處於結束時運行狀態。
BOOL CloseHandle( _In_ HANDLE hObject )成功返回true,否者false
測試代碼1當線程循環的次數小於主線程次數時
#include#include using namespace std; DWORD WINAPI Print_Thread(LPVOID data) { cout<<"開始線程\n"; for(int index=0;index<25; index++)//循環25次 { cout<<"Thread_"<<(int)data<<"_"< #include using namespace std DWORD WINAPI Print_Thread(LPVOID data) { cout<<"開始線程\n"; for(int index=0; index<50;index++)//循環50次 { cout<<"Thread_"<<(int)data<<"_"<
只看看代碼1可能沒有什麼特別的發現,所以我寫了代碼2與其進行對比。細心的讀者會發現我只是改了主線程和子線程for循環的次數。
對比兩個代碼你會發現,當主線程結束時,子線程還在繼續,由於我加了system("pause");所以第一個主線程的for循環結束後,程序沒有直接退出,然而我們才能看到子線程還在繼續跑直到結束才停止。如果你將system("pause");你會發現,當主線程執行完後程序直接退出,不會等待子線程結束。