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

嵌入式C基础知识(10)

C语言如何实现一个频繁使用短小函数,C++如何实现?

C语言可以使用宏定义实现一个短小函数,如下面例子所示。但是宏定义语句不会进行检查,并且对书写格式有过分的讲究。比如MAX和括号之间不能有空格,每个参数都要放在括号里。尽管如此,仍然会因为没有参数类型检查造成错误。

#define MAX(a,b) ((a)>(b)?(a):(b))

intmain(){inta=1,b=0,c=0;c=MAX(a,b);//程序运行正常

c=MAX(a,"Hello");//未进行类型检查,将错误的比较int和字符串。

c=MAX(a++,b);//a被增值两次,结果:c=2, a=3

c=MAX(a++,b+10);//a增值一次,结果:c=10, a=2

}

C++使用内联函数来实现,内联函数被编译器自动的以函数的形式添加进代码,因此会正常的进行参数检查。并且内联函数可以提高函数的使用效率。但是要注意内联函数不允许使用循环语句和开关语句,通常情况下,内联函数都是1-5行的小函数。

inlineintMAX(inta,intb){returna>b?a:b;}

产生死锁的原因是什么?

多个并发进程因争夺系统资源而产生相互等待的现象。即:一组进程中的每个进程都在等待某个事件发生,而只有这组进程中的其他进程才能触发该事件,这就称这组进程发生了死锁。

产生死锁的本质原因为:

1)、系统资源有限。

2)、进程推进顺序不合理。

i++和++i去别,哪个速度更快?

++/--属于C/C++中的自增运算符,表示操作数增/减一。一般自增运算符有两种写法:i++ / ++i。

区别:

用在独立的语句中:i++和++i没有区别。

用在赋值表达式中:y=i++表示先给y赋值,i自身再加一;y=++i表示先i自身加一再赋值给y。

速度上:++i的速度比较快,详细的流程如下:

// i++等效于

intj=i;i=i+1;returnj//++i相当于

i=i+1;returni;

死锁的4个必要条件

1、互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。

2、占有且等待:一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源。

3、不可抢占:别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来。

4、循环等待:存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。

当以上四个条件均满足,必然会造成死锁,发生死锁的进程无法进行下去,它们所持有的资源也无法释放。这样会导致CPU的吞吐量下降。所以死锁情况是会浪费系统资源和影响计算机的使用性能的。那么,解决死锁问题就是相当有必要的了。

死锁的处理方式有哪些?

死锁的处理方式主要从预防死锁、避免死锁、检测与解除死锁这四个方面来进行处理。

预防死锁

1、资源一次性分配:(破坏请求和保持条件)

2、可剥夺资源:即当某进程新的资源未满足时,释放已占有的资源(破坏不可剥夺条件)

3、资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)

避免死锁

预防死锁的几种策略,会严重地损害系统性能。因此在避免死锁时,要施加较弱的限制,从而获得 较满意的系统性能。由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法。

http://www.lryc.cn/news/4111.html

相关文章:

  • TC3xx FlexRay™ 协议控制器 (E-Ray)-01
  • 优劣解距离法TOPSIS——清风老师
  • 【Unity3D】Shader常量、变量、结构体、函数
  • LeetCode 刷题系列 -- 496. 下一个更大元素 I
  • Docker 搭建本地私有仓库
  • XML中的CDATA且mybatis中特殊字符转义
  • 位运算 | 1356. 根据数字二进制下 1 的数目排序
  • React Hooks之useState详解
  • 选购交换机的参数依据和主要的参数指标详解
  • Connext DDS属性配置参考大全(1)
  • Docker安全
  • 刷题记录:牛客NC20279[SCOI2010]序列操作
  • Fluent Python 笔记 第 6 章 使用一等函数实现设计模式
  • windbg-应用层实时调试
  • 【Python语言基础】——Python NumPy 数组索引
  • MWORKS--MoHub介绍
  • Netty零拷贝机制
  • C++:提高篇: 栈-寄存器和函数状态:windows X86-64寄存器介绍
  • MyBatis-Plus入门案例
  • 适用于 Windows 11/10/8/7 的 10 大数据恢复软件分享
  • 在线支付系列【23】支付宝支付接入指南
  • linux系统常用命令
  • 面试(十一)new与delete(整理) 及 内存泄露
  • 2D图像处理:2D ShapingMatching_缩放_旋转_ICP_显示ROI
  • (考研湖科大教书匠计算机网络)第四章网络层-第一、二节:网络层概述及其提供的服务
  • 概论_第8章_假设检验的基本步骤__假设检验的类型
  • SpringMVC--简介和入门案例
  • Cmake入门02-检测环境(笔记)
  • Android JNI C++读写本地文件
  • 图形化深度学习开发平台PaddleStudio(代码开源)