線程創建函數CreateThread
修改說明:
CreateThread()l來創建線程其實是一種不太好的方法,在實際使用中盡量使用_beginthreade()來創建線程,因為更加的安全
函數的原型:
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 );
參數說明:
第一個參數 lpThreadAttributes
表示線程內核對象的安全屬性,一般傳入NULL表示使用默認設置。
第二個參數 dwStackSize
表示線程棧空間大小。傳入0表示使用默認大小(1MB)。
第三個參數 lpStartAddress
表示新線程所執行的線程函數地址,多個線程可以使用同一個函數地址。
第四個參數 lpParameter
是傳給線程函數的參數。
第五個參數 dwCreationFlags
指定額外的標志來控制線程的創建,為0表示線程創建之后立即就可以進行調度,如果為CREATE_SUSPENDED則表示線程創建后暫停運行,這樣它就無法調度,直到調用ResumeThread()。
第六個參數 lpThreadId
將返回線程的ID號,傳入NULL表示不需要返回該線程ID號。
返回值
CreateThread的返回值是線程的句柄,失敗的話就返回NULL
實例1:
/* 創建第一個線程。主進程結束,則撤銷線程。 */ #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; }
實例2:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <Windows.h> #include <process.h> //typedef unsigned long DWORD; //#define WINAPI __stdcall 標准的呼叫; //typedef void far *LPVOID; DWORD WINAPI mymsg(LPVOID lp) { MessageBoxA(0,"Hello China","Welcome!",0); return 0; } int main(void) { //順序執行 //MessageBoxA(0,"Hello China","Welcome!",0); //MessageBoxA(0,"Hello China","Welcome!",0); //MessageBoxA(0,"Hello China","Welcome!",0); //MessageBoxA(0,"Hello China","Welcome!",0); //_beginthread(); //以前依賴的是_beginthread進行多線程執行; int i; HANDLE hthread; DWORD threadid;//保存進程的編號; for (i = 0; i <5; i++) { hthread = CreateThread( NULL,//表示線程內核對象的安全屬性; NULL,//表示線程堆棧空間的大小; mymsg,//表示新線程所執行的線程函數地址; NULL,//函數的參數; 0,//立刻執行; &threadid//將返回線程的ID號; ); //單線程的等待; //INFINITE //超時等待,等待上一步執行完畢才繼續執行; //IGNORE //忽略等待,直接啟用線程; WaitForSingleObject(hthread,INFINITE); CloseHandle(hthread);//關閉一個線程; } //mymsg(NULL); //CreateThread() system("pause"); return 0; }