可重入函数

       重入函数,我们可以理解为函数被多次重复进入。在多任务系统环境下会出现这种情况,比如函数b同时被多个任务加载执行,此时函数b就发生了重入。

      函数的重入是有条件的,并不是所有的函数都能够被重入。对于不满足重入条件的函数进行重入操作,会出现不可预知的错误。比如下面的函数就不满足重入条件,如果对其进行重入操作,会发生不可预知的错误。

      int a = 0;

      func example(int value) 

     {

           a = value;//(1)

           printf("%d", a);

     }

 函数对全局变量a进行操作。如果多个进程同时调用了函数expmple(),其中一个进程刚执行完语句(1),另一个进程被激活并调用了该函数,此时前面一个进程调用的example函数会被中断执行。在这种情况下,后一个进程会对a重新赋了一个新值。当前面进程被重新唤醒执行时,由于a是全局变量,函数并不会对其单独保存一个副本,此时就会出现第一个进程得到的结果跟实际预期结果不想匹配的情况。可以得出的结论是,如果函数操作的有全局变量,不能直接对其进行重入操作。可以通过关闭中断或是对操作的变量进行加锁包含,使得函数可重入。

      函数直接操作全局变量,只是函数不可重入的一种。不可重入函数主要有如下几种:

(1) 函数不可中断;

(2)函数对全局变量不加保护进行操作;

(3)函数中有static类型的变量,对其不加保护进行操作;

(4)函数中调用了malloc()和free()函数;(这两个函数主要是对堆进行操作,需要维护堆的全局指针,一旦发生重入,会导致不可预知的问题)

 对比不可重入函数,如果我们在实际应用中需要用到重入函数,需要注意以下几点:

(1) 函数可中断;

(2)函数只有非static的局部变量操作;

(3)如果函数内部需要static变量,并需要对其进行操作,需要进行加速保护;

(4)操作全局变量,需要加锁保护;

(5)函数本身不调用不可重入的函数;

   今天对重入函数进行了学习,秉着好记性不如烂笔头的原则,记录下自己的理解,加深记忆和理解。错误和遗漏还望指正,谢谢!!!  后续继续补充。。。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值