1. 什么是线程?
线程是一个内核对象(保存在内核中的结构体),是 CPU 进行调度的基本单位,可以将线程看作一段执行的代码。一个线程最少由一个描述自身的线程内核对象和对应的线程上下文构成(一组CPU提供的寄存器、堆栈[参数\返回地址])构成
2. 线程的特点
一个进程中最少有一个线程,可以调用函数创建多个线程。线程之间实际上并不存在从属关系。但是通常情况下,我们将执行主函数的线程称为主线程,主线程的特点是,一旦主线程退出,当前进程下所有被创建的其它线程都会退出
3. 线程的重点
线程的创建:CreateThread(win32) \ _beginthreadex(crt)
线程的结束:TerminateThread \ ExitThread
线程的传参:使用指针进行参数的传递
/* 1.什么是线程? 线程是一个内核对象(保存在内核中的结构体),是 CPU 进行调度的基本单位 ,可以将 线程看作一段执行的代码。一个线程最少由一个描述自身的线程内核对象和对应的线程 上下文(一组CPU提供的寄存器、堆栈[参数\返回地址])构成
线程的特点 一个进程中最少有一个线程,可以调用函数创建多个线程。线程直之间实际上并不存在从 属关系。但是通常情况下,我们将执行主函数的线程称为主线程,主线程的特点是,一旦 主线程退出,当前进程下所有被创建的其它线程都会退出
线程的重点 线程的创建: CreateThread(win32) \ _beginthreadex(crt) 线程的结束: TerminateThread \ ExitThread 线程的传参: 使用指针进行参数的传递 */
// 定义一个结构体,它创建的变量被作为参数传递给线程 typedef struct _THREAD_PARAMATER { char cValue; int nValue; double fValue; } THREAD_PARAMATER, * PTHREAD_PARAMATER;
// 提供一个被作为线程起始位置的回调函数,函数原型必须符合要求 DWORD WINAPI WorkerThread(LPVOID lpThreadParameter) { // 由于传进来的是一个指针,为了获取指向的内容,通常需要强转 auto Paramater = (PTHREAD_PARAMATER)lpThreadParameter;
while (true)
{
printf("我是 WorkerThread [%c]\n",
Paramater->cValue);
}
return 0;
}
int main() { // 创建一个结构体变量,将结构体的地址作为参数进行传递,[更多的时候我们会申请 // 一块堆空间,用于保存传递的参数,防止当前线程结束,局部变量无法访问] THREAD_PARAMATER Paramater{ ‘a’, 100, 3.14 };
// 创建一个以指定位置开始的线程,如果创建成功返回线程句柄
HANDLE Thread = CreateThread(
NULL, // 使用默认的安全属性
0, // 使用默认的栈大小,通常是 1M
WorkerThread, // 线程的起始位置,是一函数
&Paramater, // 提供给线程函数的参数
0, // 线程标志,例如可以是创建时挂起
NULL); // 如果线程创建成功,返回 TID
while (true)
{
// 多个线程之间的执行时间是没有规律的,线程由 CPU 调度,每个线程在执行大概
// 10 ms 左右,会切换到另外一个线程,所以两个线程的输出是隔开的
printf("我是 MainThread\n");
}
// C 语言提供了库函数 _beginthreadex 和 endthreadex 用于创建和结束线程,本
// 质上,它们是对系统 API 的封装,具有跨平台行,会初始化一些和运行时库相关的资源
// 如果使用纯C语言编写程序,推荐用这两个函数
return 0;
} ```