关闭

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

570人阅读 评论(0) 收藏 举报
分类:

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

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

常见的不可重入函数有:

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

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

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

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

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



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:74152次
    • 积分:1130
    • 等级:
    • 排名:千里之外
    • 原创:33篇
    • 转载:16篇
    • 译文:1篇
    • 评论:7条
    文章分类
    最新评论