线程创建函数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; }