当前位置: 首页 > news >正文

嵌入式软件信号量、互斥功能实现,解决不可重入性

函数的重入性

若对所使用的全局变量不加以保护,则此函数就不具有可重入性,即当多个进程调用此函数时,很有可能使有关全局变量变为不可知状态。
示例:假设 Exam 是 int 型全局变量,函数 Squre_Exam 返回 Exam 平方值。那么如下函数不具有可重入性。

unsigned int example( int para )
{unsigned int temp;Exam = para; // (**)temp = Square_Exam( );return temp;
}

此函数若被多个进程调用的话,其结果可能是未知的,因为当(**)语句刚执行完后,另外一个使用本函数的进程可能正好被激活,那么当新激活的进程执行到此函数时,将使Exam 赋与另一个不同的 para 值,所以当控制重新回到“temp = Square_Exam( )”后,计算出的 temp 很可能不是预想中的结果。此函数应如下改进。

unsigned int example( int para )
{unsigned int temp;[申请信号量操作] // 若申请不到“信号量”,说明另外的进程正处于Exam = para; // 给 Exam 赋值并计算其平方过程中(即正在使用此temp = Square_Exam( ); // 信号),本进程必须等待其释放信号后,才可继[释放信号量操作] // 续执行。若申请到信号,则可继续执行,但其// 它进程必须等待本进程释放信号量后,才能再使// 用本信号。return temp;
}

所谓信号量就是解决并发中的互斥与同步问题的一种方法,经典案例为银行取钱程序。信号量就是一个变量,在进行某些操作之前需要判断信号量的值,来判断该资源是否被占用。如下,

unsigned int example( int para )
{unsigned int temp;if(flag == 0) return;//[申请信号量操作] // 若申请不到“信号量”,说明另外的进程正处于else flag = 0;Exam = para; // 给 Exam 赋值并计算其平方过程中(即正在使用此temp = Square_Exam( ); // 信号),本进程必须等待其释放信号后,才可继flag = 1;//[释放信号量操作] // 续执行。若申请到信号,则可继续执行,但其// 它进程必须等待本进程释放信号量后,才能再使// 用本信号。return temp;
}

http://www.mrgr.cn/news/62765.html

相关文章:

  • 网络编程基础-Reactor线程模型-原理剖析
  • Golang高级语法-工具链
  • 2024外贸还有必要做Linkedln吗?
  • Github 2024-10-24 Go开源项目日报 Top10
  • 视频智能分析平台LiteAIServer烟火识别软件智能视频分析的新里程碑
  • 多GPU训练大语言模型,DDP, ZeRO 和 FSDP
  • 编程之路:蓝桥杯备赛指南
  • 安科瑞AM5SE-IS 防逆流保护装置 功能全面 逆功率保护
  • 【Hive sql 面试题】用一条sql语句查询出每门课都大于80分的学生姓名
  • hive将包含逗号的字段拆分为多列
  • chrome编辑替换js文件的图文教程
  • 易考八股文之SpringBoot和SSM的优缺点
  • 搜维尔科技:Win8 VR生产安全,多平台兼容,实时反馈与指导
  • 持续基础怎么搞?Jenkins+Docker+Git实战
  • 大模型常见依赖库的安装问题汇总
  • 在Java中 try catch 会影响性能吗?
  • 结构体数组复习
  • (蓝桥杯C/C++)——STL(下)
  • 【微服务】Nacos 注册中心
  • 17. 从尾到头打印链表
  • 白盒测试基本概念(学习笔记)
  • Redis数据库
  • 【IC每日一题--单bitCDC跨时钟和同步FIFO】
  • mysql8.0.32升级到8.0.40
  • LeetCode20:有效的括号
  • 支持ANC的头戴式蓝牙耳机,更有小金标认证,QCY H3 Pro体验