线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。一个进程可以有很多线程,每条线程并行执行不同的任务。
在window应用程序时,操作系统会自动创建一个主线程,通过主线程,可以创建多个线程或进程。
1、头函数
使用CreateThread函数需要图函数“windows.h”:
#include "windows.h"
2、函数原型
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,//线程安全属性
DWORD dwStackSize, //堆栈大小
LPTHREAD_START_ROUTINE lpStartAddress, //线程函数
LPVOID lpParameter, //线程参数
DWORD dwCreationFlags, //线程创建属性
LPDWORD lpThreadId //线程ID
);
3、参数说明
lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。设置参数值为NULL表示使用默认安全性,不可以被子线程继承,否则需要定义一个结构体将它的bInheritHandle成员初始化为TRUE
dwStackSize:设置初始栈的大小,以字节为单位,如果为0,那么默认将使用与调用该函数的线程相同的栈空间大小。任何情况下,Windows根据需要动态延长堆栈的大小。
lpStartAddress:指向线程函数的指针,线程函数名称没有限制,必须以下列形式声明:
DWORD WINAPI 函数名 (LPVOID lpParam) ,格式不正确将无法调用成功。
lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。
dwCreationFlags :线程标志,可取值如下
(1)CREATE_SUSPENDED(0x00000004):创建一个挂起的线程,
(2)0:表示创建后立即激活。
lpThreadId:保存新线程的id,一般设置为NULL;
返回值:函数成功,返回线程句柄;函数失败返回false。
4、函数示例
主线程为printf("执行主线程\n"); 当CPU有空闲时执行次线程printf("执行线程printfThread\n");
#include "stdafx.h"
#include "windows.h"
DWORD WINAPI printfThread(LPVOID IParam)
{
while (true)
{
printf("执行线程printfThread\n");
}
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE mThread;
mThread = CreateThread(NULL, 0, printfThread, NULL, 0, NULL);
while (true)
{
printf("执行主线程\n");
}
return 0;
}