傲渊山岳 发表于 2023-7-17 08:19:22

Win32学习3

9、创建线程

①什么是线程?
线程是附属在进程上的执行实体,是代码的执行流程。一个进程可以包含多个线程,但一个进程至少要包含一个线程。
可以这么理解,进程属于是空间上的概念,是代表了4GB 的虚拟内存,而线程属于是时间上的概念,也就是说线程也就是当前正在运行中的实际的代码。在任务管理器中可以看到,一个进程包含数个线程,也就是当前这个进程有数段代码正在执行。(但不一定都是同时执行) 举个例子,当前电脑中是单个单核CPU,它也是可以执行同时执行多个线程的。在单核CPU上运行多线程并非真正意义上的多线程。我们可以这么理解,在某个时间点上,只能有一段代码在执行。但CPU执行的效率特别高,切换的比较快,这会执行的A线程,这一会执行的B线程,就仿佛两段代码在同时跑。单核的情况下是不存在多线程的。在某一个时间点上只能有一段代码在执行。一个CPU核只有一套寄存器,一套寄存器必定不能同时执行多个不同的代码。
总结上可以这么理解,一个单核CPU执行代码,多线程实际上是分时段的,这个时间段执行这段代码,另一个时间段执行另一段代码。但是无论是单核还是多核,给我们的感觉都好像是多个线程同时在跑。
②创建线程
HANDLE CreateThread(<br>LPSECURITY_ATTRIBUTES IpThreadAttributes, //SD(安全描述符)<br>SIZE_T dwStackSize,             // initial stack size<br>LPTHREAD_START_ROUTINE IpStartAddress,// thread function<br>LPVOID IpParameter            // thread argument<br>DWORD dwCreationFlags,          // creation option<br>LPDWORD IpThreadld            // thread identifier<br>);dwStackSize 初识堆栈大小(如果不填写就是操作系统默认给一个值)IpStartAddress 当前线程真正执行的代码的地址 IpParameter 线程所需要的参数在哪(实质上是一个指针) dwCreationFlags 创建线程的一个标识(这个成员如果填0的话,可以立即进入执行的状态),或者用 CREATE_SUSPENDED这个宏标识的话,这个线程就会处于一个挂起的状态。除非使用 ResumeThread 这个API 解除挂起状态,这个线程都不会执行。 IpThreadld 这个成员是整个函数返回的线程ID(区别于这个函数的返回值是线程句柄)
我们利用CreateThread这个API 可以创建一个新的线程,而因为没有进行线程控制,会出现“分时段性的多线程”(上方有解释),即为一段时间执行这一段,另一段时间执行另一段。我们可以用下面这段代码进行测试。
#include
#include
DWORD WINAPI ThreadProc(LPVOID IpParameter)
{
    for(int i = 0;i
页: [1]
查看完整版本: Win32学习3