線程創建函數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;
}
