目录

一、volatile关键字

1.功能

2.使用场景

二、函数的可重入与不可重入

1.函数的重入

2.函数的可重入

3.函数的不可重入

4.函数可重入与不可重入的判断基准

5.注意场景


一、volatile关键字

1.功能

用于修饰变量,保持变量内存可见性。

2.使用场景

问题引出:

编译器在程序编译时,有时会进行代码优化。其中有一种优化:某个变量的数据访问频率很高,编译器就可能会将该数据直接加载到寄存器中,cpu在访问这个变量的数据时,就会直接通过寄存器获取,不再从内存中获取,从而提高效率。

存在问题:

此时若内存中的数据发生了变化,cpu仍访问的是寄存器中变化之前的数据。

解决方法:

使用volatile关键字修饰该变量,保持该变量的内存可见性。

二、函数的可重入与不可重入

1.函数的重入

在不同的执行流程中,同时进入同一个函数的内部运行。

例如以下程序:

#include<stdio.h>
#include<signal.h>
#include<unistd.h>int num1 = 1, num2 = 1;
int test(){num1++;sleep(3);num2++;printf("%d----%d\n",num1,num2);
}void sigcb(int no){test();
}int main(){signal(SIGINT, sigcb);test();return 0;
}

运行程序后,当我们按下ctrl+c给入终止信号SIGINT后,test函数就可能发生函数重入(为了保证发生,这里给了一个3秒的延迟),从而导致两次输出的num1与num2不一致,如下:

2.函数的可重入

一个函数被重入之后,不会出现预期之外的结果,这种函数就叫做可重入函数。

3.函数的不可重入

一个函数被重入之后,有可能会出现预期之外的结果,这种函数就叫做不可重入。

4.函数可重入与不可重入的判断基准

一个函数中是否对一个全局数据进行了不受保护的非原子操作。

原子操作:一次性完成,不可被打断的操作。

5.注意场景

1.在有多个执行流程的程序中,若我们使用到了一些第三方库函数时,则需要考虑这些函数的可重入与不可重入性。

2.当我们自己封装接口,会提供给别人使用时,也需要在文档中说明对应的可重入与不可重入性。

C语言程序设计——volatile关键字、函数重入相关推荐

  1. 递归重入c语言延时函数多任务程序设计中的函数重入问题按照Keil的规范对函数添加关键字“reentrant”,将函数定义为可重入的 void Delay_MS(x) reentrant

    c语言延时函数_子牙篇(2)多任务程序设计中的函数重入问题 weixin_39559333 2020-11-29 09:07:44  39  收藏 文章标签: c语言延时函数 c语言延时函数delay ...

  2. c语言程序设计 函数说课,《C语言程序设计》之函数说课课件.ppt

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspC/C++资料 <C语言程序设计>之函数说课课件.p ...

  3. c语言程序设计 大学考试题库,广东工业大学《C语言程序设计》考试复习重点题库.pdf...

    广东工业大学<C语言程序设计>考试复习重点题库.pdf 考试复习重点资料(最新版)考试复习重点资料(最新版) 封封 面面 第1页 资料见第二页资料见第二页 复习题 [程序 1] 题目有 1 ...

  4. c语言第八章函数程序设计,C语言程序设计-第八章 函数.ppt

    C语言程序设计-第八章 函数 函数分类(从用户使用角度 ) 1.标准函数(库函数,由系统提供 ): 例如:printf 函数 .sqrt函数. 2.用户自定义函数: 例如,上面程序中的max 函数. ...

  5. amp quot memory c语言,c volatile 关键字

    C++ volatile 关键字- 简书 2017年1月1日 - 注意:本文中代码均使用Qt 开发编译环境volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改. ...

  6. STM32F103ZE单片机在WWDG窗口看门狗的EWI中断中喂狗导致系统复位的原因及解决办法(中断函数重入问题)

    版权声明:本文为博主原创文章,欢迎转载    https://blog.csdn.net/ZLK1214/article/details/78308058 程序开启了WWDG的Early wakeup ...

  7. 【C语言安全编码之可重入函数】1、可重入函数的基本概念

  8. C语言程序设计 文件操作函数

    文件操作函数 C语言 (FILE fputc fgetc fputs fgets fscanf fprintf) 在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别 ...

  9. C语言程序设计 设计用函数实现模块化程序设计

    1 函数是什么 函数就是功能.每一个函数用来实现一个特定的功能.函数的名字反映其代表的功能. 一个C程序可由一个主函数和若干个其他函数构成.由主函数调用其他函数,其他函数也可以互相调用.同一个函数可以 ...

最新文章

  1. IntelliJ IDEA 更新后,电脑卡成球,该如何优化?
  2. 算法(第四版)之快速排序
  3. 上海交通大学乐经良高数手写笔记-一元积分学
  4. JAVASE_File类(实践)——目录拷贝
  5. 最精美详尽的 HTTPS 原理图
  6. TEG《选择》乘风破浪 · 披荆斩棘
  7. Linux中g++与gcc的区别
  8. 游戏视觉控壁纸党可以开始行动!
  9. 翻译:如何理解梯度下降算法Gradient Descent algorithm
  10. Java小游戏 超级玛丽源码分享
  11. word转网页html,Word转网页html
  12. Java工作流有哪些?如何快速掌握Java技术
  13. 中期答辩记录与总结反思
  14. 不要在本该奋斗的年纪选择了安逸
  15. 淘宝卖家中心打开淘宝客推广网页空白
  16. 数钥科技遭用户投诉:“招集令”被指息费高,曾有助贷平台被处罚
  17. liferay6.2 使用默认方式实现可配置的portlet
  18. 15款js编辑器大全
  19. 架构师培训:aop是什么
  20. 【Datawhale跨模态实践学习笔记】项目后端学习

热门文章

  1. flutter permission动态权限申请以及IOS端权限问题审核被拒处理
  2. 【MMU篇】一文总结ARMv8中的MMU架构
  3. 计算机视觉到底有多热?它的前景是这样的……
  4. CRM软件哪个好?该如何选择?
  5. JS(javascript) 将网站加入收藏夹
  6. 【Shotcut】用最短路径编辑一个视频
  7. vue-table里面放入图片
  8. android mvvm官方demo,Android MVVM实战Demo完全解析
  9. 货币兑换(判断正环)
  10. 销售开发新客户的渠道