UCOSII 信号量和互斥信号量(保姆级别讲解)----看完不后悔系列!!!

UCOSII 任务的同步与通信状态(保姆级别讲解)----看完不后悔系列!!!

添加链接描述

在前一篇文章基础背景下,我们为了解决对共享资源访问出现线程冲突的问题,引入了几个概念,分别是计数型信号量和互斥型信号量。接下来我会根据自己的理解为大家一一进行讲解。

首先,什么叫做信号量?

还记不记得在上一篇文章中贴了一张关于系统中任务同步与通信的模型图,这里再贴一次。

在这里插入图片描述如图所示,其中信号量、消息队列都可以统称为事件。本篇文章只讨论信号量。使用信号量的最初目的,是为了给共享资源设立一个标志。我们可以将其想象成我们经常使用的标志位。只不过该标志位代表的是共享资源被占用的情况罢了。这其实也是计数型信号量和互斥型信号量的区别所在。为了让大家能够清楚的理解其含义,还是以一个实例来进行说明。

实例:

如果一个电话亭只允许一个人进去打电话,那么电话亭的门上就应该有一个可以变换两种颜色的标志,类似于我们在日常生活中见到的公共厕所,如果里面有人门上的标志会显示红色,如果没人门上的标志会显示绿色。这样打电话的人就可以根据牌子的颜色来了解电话亭的被占用情况。其实这里的电话亭就是我们刚才所说的共享资源。例如,如果一个人去电话亭打电话时见到牌子上的颜色是绿色,那么他就可以进去打电话,如果是红色,那么他只好等待。如果又陆续来了很多人,那么就需要排队等待直到门上的标志变为绿色下一个等待的人才可以进去打电话。

在上述实例中,由于同一时刻只能有一个线程可以对共享资源进行访问,所以被叫做“互斥型信号量”。大家可以好好理解理解“互斥”这两个字的含义,说的再通俗点,有我没他,有他没我~~~,哈哈。

其实互斥型信号量相当于长度为1的队列,至于什么是队列,会在之后的文章中进行讲解。

再举个实例,如果电话亭可以允许多人打电话,那么电话亭门前就不应该是那种只有红色和绿色两种颜色状态的牌子,而应该是计数器,初始值一般是0,该计数器在每进去一个人是会自动加1,而每出去一个人时自动减1。这种信号量叫做计数型信号量。

计数型信号量模型图:

在这里插入图片描述

互斥型信号量模型图:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40544107/article/details/108226991