



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一篇文章带你了解C语言函数的可重入性目录一、不可重入函数。二、可重入函数。三、如何写出可重入的函数四、函数的可重入性和线程安全的关系五、malloc和printf为什么不可重入总结
一、不可重入函数。
在函数中如果我们使用静态变量了,导致产生中断调用别的函数的过程中可能还会调用这个函数,于是原来的静态变量被在这里改变了,然后返回主体函数,用着的那个静态变量就被改变了,导致错误。这类函数我们称为不可重入函数。
在嵌入式系统的设计中,经常会出现多个任务调用同一个函数的情况。如果这个函数不幸被设计成为不可重入的函数的话,那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据,从而导致不可预料的后果。
不可重入函数在实时系统设计中被视为不安全函数。
满足下列条件的函数多数是不可重入的:
(1)函数体内使用了静态的数据结构;
(2)函数体内调用了malloc()或者free()函数;
(3)函数体内调用了标准I/O函数。
(4)函数体内调用了不可中断的硬件寄存器,如串口收发寄存器
二、可重入函数。
可重入函数可以被一个以上的任务调用,而不必担心数据被破坏。可重入函数任何时候都可以被中断,一段时间以后又可以运行,而相应的数据不会丢失。
可重入函数或者只使用局部变量,即保存在CPU寄存器中或堆栈中;或者使用全局变量,则要对全局变量予以保护。
若一个函数是可重入的,则该函数必须满足一下必要条件:
1、不能含有静态(全局)非常量数据。
2、不能返回静态(全局)非常量数据的地址。
3、只能处理由调用者提供的数据。作为可重入函数的输入参数,只能由调用者提供,而且所提供的输入数据必须满足上面两点要求
4、不能依赖于单实例模式资源的锁。
5、不能调用不可重入的函数。函数内部,尽量不能用malloc和free之类的方法进行内存分配和释放,如果使用,一般情况下会造成该函数的不可重入
三、如何写出可重入的函数
1、在写函数时候尽量使用局部变量(例如寄存器、堆栈中的变量)。不访问那些全局变量,不使用静态局部变量
2、如果确实需要访问全局变量(包括static),一定要注意实施互斥手段。可重入函数在并行运行环境中非常重要,但是一般要为访问全局变量付出一些性能代价。编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护。
四、函数的可重入性和线程安全的关系
可重入与线程安全两个概念都关系到函数处理资源的方式。但是,他们有一定的区别。可重入概念会影响函数的外部接口,而线程安全只关心函数的实现。
大多数情况下,要将不可重入函数改为可重入的,需要修改函数接口,使得所有的数据都通过函数的调用者提供。要将非线程安全的函数改为线程安全的,则只需要修改函数的实现部分。一般通过加入同步机制以保护共享的资源,使之不会被几个线程同时访问。
线程安全与可重入性是两个不同性质的概念。
可重入是在单线程操作系统背景下,重入的函数或者子程序,按照后进先出的线性序依次执行完毕。多线程执行的函数或子程序,各个线程的执行时机是由操作系统调度,不可预期的,但是该函数的每个执行线程都会不时的获得CPU的时间片,不断向前推进执行进度。
可重入函数未必是线程安全的;线程安全函数未必是可重入的。例如,一个函数打开某个文件并读入数据。这个函数是可重入的,因为它的多个实例同时执行不会造成冲突;但它不是线程安全的,因为在它读入文件时可能有别的线程正在修改该文件,为了线程安全必须对文件加“同步锁”。
函数在它的函数体内部访问共享资源使用了加锁、解锁操作,所以它是线程安全的,但是却不可重入。因为若该函数一个实例运行到已经执行加锁但未执行解锁时被停下来,系统又启动该函数的另外一个实例,则新的实例在加锁处将转入等待。如果该函数是一个中断处理服务,在中断处理时又发生新的中断将导致资源死锁。
五、malloc和printf为什么不可重入
malloc和printf通常使用全局结构,并在内部使用基于锁的同步。这就是为什么它们不可重入。
malloc函数可以是线程安全的,也可以是线程不安全的。两者都不可重入:
malloc在全局堆上操作,同时发生的两个不同的malloc调用可能返回相同的内存块。(第二个malloc调用应该在获取块的地址之前发生,但块没有标记为不可用)。这违反了malloc的后置条件,因此此实现不会重新进入。
printf函数也对全局数据进行操作。任何输出流通常都使用一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 软件设计师考试全面分析试题及答案
- 网络互联技术及其应用试题及答案
- 政治参与中的意愿与行为研究试题及答案
- 西方政治制度与国际法的重要性及影响分析试题及答案
- 团队文化在项目管理中的作用试题及答案
- 政治算法在民主决策中的应用试题及答案
- 壹释机电工程考试内容知识的核心要素试题及答案
- 公共政策解析与评估试题及答案
- 新时代背景下公共政策的创新研究试题及答案
- 透视2025年西方政治制度的社会结构试题及答案
- 2024年国家开放大学《思想道德与法治》形考大作业参考答案
- 基于X-13A-S季节调整方法的铁路客运量预测分析
- 广东省汕头市2022-2023学年六年级下学期语文期末考试试卷(含答案)
- 上海市初中生命科学学业会考总复习
- 2023-2024学年山东省临沂市兰陵县小升初总复习语文测试题含答案
- 急性ST段抬高型心肌梗死溶栓治疗的合理用药指南
- 员工岗前消防安全教育培训记录
- 30题中核集团核电站设备管理员岗位常见面试问题含HR问题考察点及参考回答
- 华为企业数据架构、应用架构及技术架构设计方法
- 2023年1月福建省普通高中学业水平合格性考试通用技术+答案
- 土地纠纷起诉状(标准版)
评论
0/150
提交评论