不可重入函数 与 可重入函数

原创 2016年05月30日 23:26:04

不可重入函数不可以在它还没有返回就再次被调用;该函数在被调用还没有结束之前,再次被调用,从而可能产生错误。 但是,可重入函数不存在这样的问题。

不可重入函数在实现时通常使用了全局的资源(eg. 全局变量),在多线程的环境下,如果没有很好的处理数据保护互斥访问,就可能会发生错误。

常见的不可重入函数有:

printf --- 引用全局变量stdout;

malloc --- 全局内存分配表,分配堆栈空间;

free --- 全局内存分配表,释放堆栈空间;

以prinf为例,中断在任何时候都可能发生,比如发生在prinft执行过程中,假若又发生了中断嵌套,而此时stdout资源被占用,所以第二个中断的printf等待第一个中断的stdout资源释放,而第一个中断等待第二个中断返回,造成了死锁,这样printf就发生了重入,这种情况是不允许的。

在unix里面,通常会有加上_r的后缀同名可重入函数版本。如果实在没有,不妨在可预见的发生错误的地方尝试加上保护锁同步机制等。



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

可重入和不可重入

重入一般可以理解为一个函数在同时多次调用,例如操作系统在进程调度过程中,或者单片机、处理器等的中断的时候会发生重入的现象。 一般浮点运算都是由专门的硬件来完成,举个例子假设有个硬件寄存器名字叫做FLO...
  • wenhui_
  • wenhui_
  • 2011年10月19日 21:51
  • 23818

不可重入函数总结

1.malloc,free, printf均是不可重入函数(意味不能在中断函数或信号处理函数同时调用),但是线程安全函数(意味它可以被多个线程调用) 2.函数有static变量,则该函数是不可重入函数...

可重入函数与不可重入函数概念以及编写规范

不可重入怎么改改成可重入函数。一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函...

重入问题

一、可重入函数 1)什么是可重入性?      可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反, 不可重入(non-reentrant)函数不能由超过一个任务所共...

C语言之可重入函数 && 不可重入函数

转自:http://bubuko.com/infodetail-312842.html 可重入函数      在 实时系统的设计中,经常会出现多个任务调用同一个函数的情况。如果这个函数不幸...

函数可重入性与不可冲入性及编写规范

一、可重入函数 1)什么是可重入性? 可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反, 不可重入(non-reentrant)函数不能由超过一个任务所共享,除...

可重入函数c语言

  • 2014年07月29日 09:08
  • 51KB
  • 下载

可重入函数

  • 2008年01月17日 15:19
  • 122KB
  • 下载

不可重入函数

转自:http://www.cppblog.com/franksunny/archive/2007/08/03/29269.html 主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断...

C语言可重入函数及函数编写规范

  • 2009年12月27日 10:50
  • 141KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:不可重入函数 与 可重入函数
举报原因:
原因补充:

(最多只允许输入30个字)