windows核心编程--4线程和线程同步

Posted awxvdmvsexc0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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实现,进餐完后则放下两个筷子,也就是释放两个互斥量;若没有获取到两个互斥量,则释放已获取到的互斥量并等待。这样思路就??了,编写完代码后,演示结果如下:

技术图片




以上是关于windows核心编程--4线程和线程同步的主要内容,如果未能解决你的问题,请参考以下文章

多线程编程

回炉重造之重读Windows核心编程-011-线程池和其他异步方式

回炉重造之重读Windows核心编程-006-线程

Java多线程编程核心技术,第三章

多线程编程之Windows同步方式

多线程核心点