修改说明:
CreateThread()
来创建线程其实是一种不太好的方法,在实际使用中尽量使用_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
", GetCurrentThreadId()); //输出主线程pid
Sleep(2000);
}
DWORD WINAPI ThreadFunc(LPVOID p)
{
printf("我是子线程, pid = %d
", 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;
}