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、常用的退出线程的函数有ExitThreadTerminateThread,由于用法和我上一篇退出进程的函数相似,就不再说明。

    3、关于win32的线程同步,可以使用互斥量、临界区等来实现。由于接下来的实验使用互斥量完成的,所以这里只讲互斥量的用法。涉及到互斥量来进行线程同步的函数主要有两个:CreateMutexWaitForSingleObject,第一个函数作用为创建一个互斥量,例如mutex = CreateMutex(NULL, FALSE, NULL);;第二个函数作用为等待取得互斥量(该函数作用不仅仅以此,传递参数为互斥量,则等待取得互斥量,若为信号,则等待信号传递过来),该函数第二个参数若为INFINITE则表示一直等待下去直到拿到互斥量,若设置为具体的数字,则表明为等待该时间后就返回,例如WaitForSingleObject(mutex, INFINITE);


四、实验要求

    使用win32程序编写一个模拟哲学家进餐的gui演示


五、实验步骤

    1、关于哲学家进餐问题是什么,可以百度,这里不再细说。首先我们创建六个互斥量表明六根筷子,六个哲学家创建六个子线程,如下所示:

    2、接着我们来编写每个哲学家的行为,每个哲学家必须要拿到左右两边的两个筷子才能进餐,也就是要获取到两个互斥量,获取互斥量通过WaitForSingleObject实现,进餐完后则放下两个筷子,也就是释放两个互斥量;若没有获取到两个互斥量,则释放已获取到的互斥量并等待。这样思路就🆗了,编写完代码后,演示结果如下:

posted @ 2020-05-16 16:03  windy_ll  阅读(274)  评论(0编辑  收藏  举报