不可重入函数不可以在它还没有返回就再次被调用;该函数在被调用还没有结束之前,再次被调用,从而可能产生错误。 但是,可重入函数不存在这样的问题。
不可重入函数在实现时通常使用了全局的资源(eg. 全局变量),在多线程的环境下,如果没有很好的处理数据保护和互斥访问,就可能会发生错误。
常见的不可重入函数有:
printf --- 引用全局变量stdout;
malloc --- 全局内存分配表,分配堆栈空间;
free --- 全局内存分配表,释放堆栈空间;
以prinf为例,中断在任何时候都可能发生,比如发生在prinft执行过程中,假若又发生了中断嵌套,而此时stdout资源被占用,所以第二个中断的printf等待第一个中断的stdout资源释放,而第一个中断等待第二个中断返回,造成了死锁,这样printf就发生了重入,这种情况是不允许的。
在unix里面,通常会有加上_r的后缀同名可重入函数版本。如果实在没有,不妨在可预见的发生错误的地方尝试加上保护锁同步机制等。