4-1RT-Thread信号量

4-1RT-Thread信号量

在这里插入图片描述
在这里插入图片描述
在实时系统中,一项工作往往需要多个线程共同完成。而线程对CPU的使用权由其优先级来确定。如果线程的功能是独立的,如控制LED灯周期性闪烁,那么我们只需要关注线程具体功能的实现即可。但在线程之间需要配合完成某些功能时,则需要严格的逻辑控制。如图所示。
在这里插入图片描述
Thread 1和thread 2都可以访问共享内存块,并且thread1将数据写入共享内存块后,thread 2才可以访问。如果对共享内存的访问不是排他性的,那么各个线程之间可能同时访问它,这将引起数据的一致性问题。例如在thread 2试图读取数据之前,thread1还未完成数据的写入,那么thread 2读取的数据将是不完整的,会造成读取数据的错乱。为了防止出现数据的差错,两个线程访问的动作必须是互斥进行的。应该是在一个线程对共享内存块操作完成后,才允许另一个线程去操作。这样线程一与线程二才能正常配合,使工作正确的执行。
在这里插入图片描述
在这里插入图片描述
多个线程操作或访问同一个区域或代码,这块代码我们就称作临界区。上述例子中的共享内存块就是临界区。而线程的互斥是指对于临界区资源访问的排他性。当多个线程都要使用临界区资源时,任何时刻最多只允许一个线程去使用,其他要使用该资源的线程则需要等待,直到占用资源者释放该资源。线程的同步方式有很多,其核心思想都是在访问临界区时,只允许一个或一类线程运行。

在这里插入图片描述
如何对临界区进行保护?我们可以使用禁止调度或关闭中断的方式进行。禁止调度是调度器上锁,上锁后不再切换到其他线程,仅响应中断。在临界操作完成之后,再将调度器调用功能打开。关闭中断与禁止调度类似,关闭中断后进行临界操作,临界操作完成后再将中断打开。使用互斥特性进行临界区保护的方式主要有信号量和互斥量。
在这里插入图片描述
以停车场为例来理解信号量的概念。当停车场空的时候,门禁会让外面的车陆续进入停车场,获得停车位。当停车场车位满的时候,门禁将禁止外面的车进入停车场,车辆在外排队等候。当停车场内有车离开时,门禁发现有空的车位让出,允许外面的车进入停车场,待空车位填满后,又禁止外部车辆进入。在此例中,门禁相当于信号量。停车场相当于公共资源,即临界区。空车位的个数就是信号量的值,此值是非负数,并且是动态变化的。车辆相当于线程。车辆通过获得门禁的允许取得停车位,就类似于线程通过获得信号量访问公共资源。

在这里插入图片描述
每个信号量对象都有一个信号量的值和一个线程等待队列。信号量的值对应了信号量对象的实例数目。例如信号量的值为五则表示共有五个信号量实例可以被使用。当信号量的实例数目为零时,再申请该信号量的线程就会被挂起在该信号量的等待队列上,等待可用的信号量实例。

在这里插入图片描述
常用的信号量类型有二值信号量和计数型信号量。其中二值信号量实例初始化值为一,代表系统默认有一个资源可用。当二值信号量的值为零时,代表临界区正被访问,其他要访问此临界区的线程将被挂起。在该信号量上当某个时刻中断或者线程释放了信号量,那么挂起在等待队列中的线程将获得信号量并恢复为就绪状态。
在这里插入图片描述
计数型信号量与二值信号量差不多一样用于资源保护。计数型信号量则允许多个线程获取信号量的访问共享资源,但会限制线程的最大访问数目。访问的线程达到信号量可支持的最大数目时会阻塞其他试图获得该信号量的线程,直到有线程释放了信号量。如图所示,本例中计数型信号量的值为三,可以允许三个线程同时访问资源。当有第四个线程需要访问资源时,此时已没有可用信号量,因此线程四会被挂起。当其中线程一释放了信号量之后,线程四才可以获取信号量访问公共资源。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/698867.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

家用路由器究竟有多费电?小白实测

小白最近听到了个笑话: 有个奶奶跟朋友说家里上不了网,让他去看看。朋友过去之后看到路由器被拔掉了,就问奶奶:“怎么把路由器拔掉了呀?”奶奶说:“那个东西的灯一闪一闪的,太费电,…

达内Angular学习

课程地址:1.1-环境搭建~1_哔哩哔哩_bilibili 一、环境搭建 安装前,确保node.js和npm包已经安装,并符合版本要求。 C:\Users\liutong>node -v v20.10.0C:\Users\liutong>npm -v 10.2.3 正式安装前,检查镜像是否为境内的镜像: C:\Users\liutong>npm config get…

Java MyBatis实战:QueryWrapper中的and和or拼接技巧

哈喽,大家好,我是木头左! 一、引言 在Java Web开发中,MyBatis是一个非常流行的持久层框架。它通过XML或注解的方式将Java对象与数据库表进行映射,从而实现数据的增删改查操作。在使用MyBatis的过程中,经常…

学习了解 JSON Schema

在数字时代,数据的快速增长要求开发者掌握有效的管理和验证技术。JSON(JavaScript Object Notation) 是一种流行的轻量级数据交换格式,在网络编程中有广泛应用。为了应对复杂数据的挑战,JSON Schema 诞生,提…

爱普生SMD3225贴片晶振升级版TSX-3225

爱普生有一款外形尺寸3.2*2.5mm的无源贴片晶振,型号TSX-3225,也是非常直观的能从型号分辨其封装尺寸大小的,被广泛应用于便携式的无线传输设备,同时,这也是一款非常成熟的产品,毕竟SMD3225封装是目前市场主…

功能强大的文本编辑器(绿色版)

UltraEdit 是一套功能强大的文本编辑器,可以编辑文本、十六进制、ASCII 码,完全可以取代记事本。 现在为你分享一个绿色免安装版,请在文末查看该软件的领取方法。 UltraEdit的强大功能 UltraEdit是一款功能强大的文本编辑器,广…

手把手教你安装 Vivado2019.2(附安装包)

一、Vivado 2019.2优点 Vivado 2019.2 作为 Xilinx 公司发布的一款设计套件版本,具有多个显著的优点,以下是对其优点的详细归纳: 集成度高:开发工具丰富并行综合功能灵活的许可证策略用户友好的界面强大的仿真和验证功能丰富的文…

数据结构与算法题目集(中文) 6-3 求链表的表长

该代码使用循环遍历链表来计算链表的长度。代码首先定义了一个整数变量i用于计数,并初始化为0。然后进入一个while循环,条件为链表L非空。在循环中,通过L L->Next来遍历链表中的每一个节点,并将计数变量i递增。最终返回计数变…

聚鼎科技:现在的装饰画做起来难吗

在当代,装饰画作为一种体现个人品味和审美情趣的方式,已经广泛应用于各种室内空间。不少人会产生这样的疑问:在现代化技术和材料的支持下,制作一幅装饰画是变得容易了,还是依旧充满挑战? 现代科技的确为装饰画的制作带…

LLM定制的四个层次

LLM(Large Language Models)代表了一种提高生产力的创新方法。他们能够简化各种任务,显著提高整体效率。从提示工程到Agents可以分为四个层次。 Level-1: Prompt engineering Prompt是简明的输入文本,用作查询或指令,引导语言模型产生所需输…

用函数指针求a和b中的大者

指针变量也可以指向一个函数。一个函数在编译时被分配给一个入口地址。这个函数入口地址就称为函数的指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。 先按一般方法编写程序: 可以用一个指针变量指向max函数,然后通过该指…

PHP短链接短网址生成源码

下载地址:PHP短链接短网址生成源码 V3.0(11月14日更新) 1.更换用户中心模板 2.首页可以更换模板(暂时只有俩套) 3.增加首页背景更换 4.logo可以在后台设置 5.更换后台模板 6.优化访问统计功能 7.删除了几个没什么用的东西 8.数据表已支持全…

【Vue】项目创建目录初始化

文章目录 vue-cli 建项目调整初始化目录结构 vue-cli 建项目 1.安装脚手架 (已安装) npm i vue/cli -g2.创建项目 vue create hm-shopping选项 Vue CLI v5.0.8 ? Please pick a preset:Default ([Vue 3] babel, eslint)Default ([Vue 2] babel, eslint) > Manually sel…

日本麻将基本规则和基本术语以及役种讲解

基本规则 无役无法和牌 “役”是特定牌的组合,不满足任何役是无法和牌的,关于役在后面会进行深入的讲解 和牌条件 满足和牌牌型有役荣和时不能振听 和牌牌型 ABC*xAAA*yDD,一般的和牌牌型,x组顺子和y组刻子加上一组对子(xy4)AA*7,特殊的和牌牌型,是一种役,名叫…

SpringSecurity入门(四)

18、权限管理/授权 18.1、针对url配置 配置SecurityConfig package com.wanqi.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.bu…

面试官问:百万QPS秒杀系统该如何设计

今天就带大家体系化的梳理下,大厂级高并发的秒杀系统该如何设计。 带大家跳出程序员思维,从架构师的视角分析下,大厂级、高并发的秒杀系统该如何设计? 秒杀系统的三个问题 问题一:为什么需要秒杀系统? 简…

CVE-2023-37569(未授权任意文件上传+弱口令爆破)

靶场简介 Online Piggery Management System v1.0 - 存在未授权的文件上传漏洞,登陆界面弱口令爆破 进入靶场 猜测弱口令admin/admin,错误,进行账号密码爆破 得到账号密码 admin/password 登陆进入,找到一处文件上传位置 上传…

SpringBoot快速部署(2)—不使用docker的常规方法

一、软件下载和部署前准备 安装软件 获取软件安装包 然后上传到服务器的 /tmp 目录下。 软件:nginx、jdk、mysql 下载 X-shell 和 Xftp 注意:这个页面下载安装的才可以免费使用。家庭/学校免费 - NetSarang Website 安装jdk 1.8 tar -zxvf /tmp/jdk-…

弱智吧”,人类抵御AI的最后防线

“写遗嘱的时候错过了deadline怎么办?” “怀念过去是不是在时间的长河里刻舟求剑?” “英语听力考试总是听到两个人在广播里唠嗑,怎么把那两个干扰我做题的人赶走?” 以上这些饱含哲学但好像又莫名其妙的问题,出自…

简易概况广告变现

广告变现是指媒体或平台通过向用户展示广告主的广告,从而获得收入的过程。 广告变现就像是一个店主,他需要一个吸引人的店面,提供优质的内容和服务,然后在店里摆放一些别人的商品或服务,每当有客人看了或买了这些商品或…