函数的可重入性理解

来源:互联网 发布:java中网络编程详解 编辑:程序博客网 时间:2024/05/20 01:09

函数的可重入性理解


  最近,项目要求可能需要做博通的交换芯片的驱动程序,涉及到多用户同时进行操作,和大量的数据处理,因此在进行代码架构的时候需要进行前期简单的验证设计。考虑到一点就是程序设计的可重入性。经过简单的搜索,在维基百科和其他朋友的帖子里找到了相关概念。为了帮助自己今后理解,特地将此概念加上自己的理解整理在此。

一、维基百科解释

复制代码
 1 若一个程序或子程序可以安全的被并行执行,则称其为可重入(reentrant或re-entrant)的;即当该子程序正在运行时,可以再次   2 进入并执行它。若一个函数是可重入的,则该函数必须满足一下必要条件:   3  1、不能含有静态(全局)非常量数据。     4    5  2、不能返回静态(全局)非常量数据的地址。   6    7  3、只能处理由调用者提供的数据。 8     作为可重入函数的输入参数,只能由调用者提供,而且所提供的输入数据必须满足上面两点要求   9   10  4、不能依赖于单实例模式资源的锁。  11   12  5、不能调用不可重入的函数。    13     <函数内部,尽量不能用 malloc 和 free 之类的方法进行内存分配和释放,如果使用,一般情况下会造成该函数的不可重入>  
复制代码

二、百度百科解释

复制代码
1 可重入函数主要用于多任务环境中。2 一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误。3 不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。  4 可重入函数也可以这样理解,重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括 static),这样的函数就是purecode(纯代码)可重入,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰。
复制代码

 

三、如何编写具有可重入性的函数

       1、在写函数时候尽量使用局部变量(例如寄存器、堆栈中的变量)。

       2、如果确实需要访问全局变量(包括static),一定要注意实施互斥手段。可重入函数在并行运行环境中非常重要,但是一般要为访问全局变量付出一些性能代价。编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护。

四、函数的可重入性和线程安全的关系

        可重入与线程安全两个概念都关系到函数处理资源的方式。但是,他们有一定的区别。可重入概念会影响函数的外部接口,而线程安全只关心函数的实现。

大多数情况下,要将不可重入函数改为可重入的,需要修改函数接口,使得所有的数据都通过函数的调用者提供。要将非线程安全的函数改为线程安全的,则只需要修改函数的实现部分。一般通过加入同步机制以保护共享的资源,使之不会被几个线程同时访问。

        线程安全与可重入性是两个不同性质的概念。

        可重入是在单线程操作系统背景下,重入的函数或者子程序,按照后进先出的线性序依次执行完毕。多线程执行的函数或子程序,各个线程的执行时机是由操作系统调度,不可预期的,但是该函数的每个执行线程都会不时的获得CPU的时间片,不断向前推进执行进度。

        可重入函数未必是线程安全的;线程安全函数未必是可重入的。例如,一个函数打开某个文件并读入数据。这个函数是可重入的,因为它的多个实例同时执行不会造成冲突;但它不是线程安全的,因为在它读入文件时可能有别的线程正在修改该文件,为了线程安全必须对文件加“同步锁”。

        函数在它的函数体内部访问共享资源使用了加锁、解锁操作,所以它是线程安全的,但是却不可重入。因为若该函数一个实例运行到已经执行加锁但未执行解锁时被停下来,系统又启动该函数的另外一个实例,则新的实例在加锁处将转入等待。如果该函数是一个中断处理服务,在中断处理时又发生新的中断将导致资源死锁。

【本博客 http://www.cnblogs.com/iTsihang 中原创之博文,版权属作者所有,欢迎转载。转载之时请保留本段内容,否则作者将保留追究版权之权利】
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 病人躺久了腰疼怎么办 站的时间长腰疼怎么办 走时间长了腿疼怎么办 站久了脚底板疼怎么办 感觉喘不过来气怎么办 女生拉大便有血怎么办 拉大便拉不出来怎么办 8岁孩子大便出血怎么办 婴儿拉大便有血怎么办 8岁孩子大便带血怎么办 9岁孩子大便出血怎么办 7岁孩子大便出血怎么办 婴儿7天不大便怎么办 餐后2小时血糖高怎么办 孕妇餐后血糖高怎么办 怀孕40天孕酮低怎么办 入职体检没有过怎么办 黑龙大会打不过怎么办 新车被冰雹砸了怎么办 苹果5手机进水了怎么办 微信gif图片过大怎么办 神武孩子养废了怎么办 神武孩子养错了怎么办 博世冰箱不制冷怎么办 孕妇吹空调腿疼怎么办 空调吹多了腿疼怎么办 空调吹的胳膊疼怎么办 空调吹的关节疼怎么办 吹空调吹的腿麻怎么办 腿吹空调就疼怎么办 吹空调后膝盖痛怎么办 吹空调膝盖疼是怎么办 空调吹的嗓子疼怎么办 嗓子疼怎么办咽口水疼 空调吹的喉咙痒怎么办 夏天吹空调腿疼怎么办 吹空调吹的腿疼怎么办 吹完空调浑身疼怎么办 空调吹的全身疼怎么办 被空调吹的头疼怎么办 吹空调吹的头疼怎么办