13-线程入门

线程入门

如果任务只是顺序执行是不合理的,应该能同时进行。由此引入多线程。

一个进程可以有多个线程。

使用多线程的好处:

  • 避免阻塞

  • 避免CPU空转

  • 提升效率

1.线程创建函数

头文件process.h

1.1CreateThread函数

CreateThread 是一种微软在 Windows API 中提供了建立新的线程的函数,该函数在主线程的基础上创建一个新线程。线程终止运行后,线程对象仍然在系统中,必须通过CloseHandle 函数来关闭该线程对象。

HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD
SIZE_T dwStackSize,//initialstacksize
LPTHREAD_START_ROUTINE lpStartAddress,//threadfunction
LPVOID lpParameter,//threadargument
DWORD dwCreationFlags,//creationoption
LPDWORD lpThreadId//threadidentifier
)

参数:

  • lpThreadAttributes 表示线程内核对象的安全属性,一般传入NULL 表示使用默认设置。

  • dwStackSize 表示线程栈空间大小。传入 0 表示使用默认大小(1MB)。

  • lpStartAddress 表示新线程所执行的线程函数地址,多个线程可以使用同一个函数地址。

  • lpParameter 是传给线程函数的参数。

  • dwCreationFlags 指定额外的标志来控制线程的创建,为 0 表示线程创建之后立即就可以进行调度,如果为 CREATE_SUSPENDED 则表示线程创建后暂停运行,这样它就无法调度,直到调用 ResumeThread()。

  • lpThreadId 将返回线程的 ID 号,传入 NULL 表示不需要返回该线程 ID 号

返回值:

  • 对应的线程句柄

1.2_beginthreadex函数(底层是CreateThread,封装了容错,因此传参和CreateThread基本一致)
unsigned long _beginthreadex(
void *security, // 安全属性, 为 NULL 时表示默认安全性
unsigned stack_size, // 线程的堆栈大小, 一般默认为 0
unsigned(_stdcall *start_address)(void *), // 线程函数
void *argilist, // 线程函数的参数
unsigned initflag, // 新线程的初始状态,0 表示立即执行, //CREATE_SUSPENDED 表示创建之后挂起
unsigned *threaddr // 用来接收线程 ID
)

返回值:

  • 成功返回线程句柄,失败返回0

注:__stdcall见第一节