windows核心编程--4、线程和线程同步
一、前言
该系列前几篇:
windows核心编程--1、使用vs2019编写第一个win32项目
windows核心编程--2、windows的画笔画刷以及一些简单的应用
windows核心编程--3、有关进程的三个函数
二、相关工具
IDE:Visual Studio 2019
三、相关概念
1、在win32程序中,我们创建一个线程主要是使用CreateThread
函数,该函数一共有6个参数,第一个参数lpThreadAttributes
表示线程安全属性,一般设置为null
;第二个参数dwStackSize
表明初始栈的大小,一般直接设置为0;第三个参数lpStartAddress
为线程执行的初始地址,一般为我们要执行的函数的函数名(在windows中,函数名代表了该函数的首地址);第四个参数lpParameter
表示我们要传递的参数,它是一个指向结构体的指针,也就是说,我们的参数在该结构体里面,如果不需要传递参数,那么设置为NULL
即可;第五个参数dwCreationFlags
为线程标志,一般设置为0;第六个参数lpThreadId
保存着线程ID。如果创建成功,则返回一个句柄,反之,则返回false
。
2、常用的退出线程的函数有ExitThread
、TerminateThread
,由于用法和我上一篇退出进程的函数相似,就不再说明。
3、关于win32的线程同步,可以使用互斥量、临界区等来实现。由于接下来的实验使用互斥量完成的,所以这里只讲互斥量的用法。涉及到互斥量来进行线程同步的函数主要有两个:CreateMutex
和WaitForSingleObject
,第一个函数作用为创建一个互斥量,例如mutex = CreateMutex(NULL, FALSE, NULL);
;第二个函数作用为等待取得互斥量(该函数作用不仅仅以此,传递参数为互斥量,则等待取得互斥量,若为信号,则等待信号传递过来),该函数第二个参数若为INFINITE
则表示一直等待下去直到拿到互斥量,若设置为具体的数字,则表明为等待该时间后就返回,例如WaitForSingleObject(mutex, INFINITE);
四、实验要求
使用win32程序编写一个模拟哲学家进餐的gui演示
五、实验步骤
1、关于哲学家进餐问题是什么,可以百度,这里不再细说。首先我们创建六个互斥量表明六根筷子,六个哲学家创建六个子线程,如下所示:
2、接着我们来编写每个哲学家的行为,每个哲学家必须要拿到左右两边的两个筷子才能进餐,也就是要获取到两个互斥量,获取互斥量通过WaitForSingleObject
实现,进餐完后则放下两个筷子,也就是释放两个互斥量;若没有获取到两个互斥量,则释放已获取到的互斥量并等待。这样思路就🆗了,编写完代码后,演示结果如下: