一 線程創建函數 CreateThread
修改說明:
這里 說了另一種創建線程方法,使用_beginthreadex()更安全的創建線程,在實際使用中盡量使用_beginthreadex()來創建線程,在博客中使用 CreateThread()l來創建線程其實是一種不太好的方法,不過這里只做原理分析,不用在實際項目中,暫且就這樣吧!
1. 函數原型:
HANDLE WINAPI CreateThread( _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, _In_ SIZE_T dwStackSize, _In_ LPTHREAD_START_ROUTINE lpStartAddress, _In_opt_ LPVOID lpParameter, _In_ DWORD dwCreationFlags, _Out_opt_ LPDWORD lpThreadId );
2. 參數說明:
-
第一個參數
lpThreadAttributes
表示線程內核對象的安全屬性,一般傳入NULL表示使用默認設置。 -
第二個參數
dwStackSize
表示線程棧空間大小。傳入0表示使用默認大小(1MB)。 -
第三個參數
lpStartAddress
表示新線程所執行的線程函數地址,多個線程可以使用同一個函數地址。 -
第四個參數
lpParameter
是傳給線程函數的參數。 -
第五個參數
dwCreationFlags
指定額外的標志來控制線程的創建,為0表示線程創建之后立即就可以進行調度,如果為CREATE_SUSPENDED則表示線程創建后暫停運行,這樣它就無法調度,直到調用ResumeThread()。 -
第六個參數
lpThreadId
將返回線程的ID號,傳入NULL表示不需要返回該線程ID號。
3.返回值
線程創建成功返回新線程的句柄,失敗返回NULL
二 實例
/* 創建第一個線程。主進程結束,則撤銷線程。 */ #include<Windows.h> #include<stdio.h> DWORD WINAPI ThreadFunc(LPVOID); void main() { HANDLE hThread; DWORD threadId; hThread = CreateThread(NULL, 0, ThreadFunc, 0, 0, &threadId); // 創建線程 printf("我是主線程, pid = %d\n", GetCurrentThreadId()); //輸出主線程pid Sleep(2000); } DWORD WINAPI ThreadFunc(LPVOID p) { printf("我是子線程, pid = %d\n", GetCurrentThreadId()); //輸出子線程pid return 0; }
這個程序功能很簡單,主線程創建一個線程,同時主線程和子線程分別向控制台輸出線程的PID,如下圖: