不可重入与可重入函数
来源:互联网 发布:淘宝店铺线下交易被骗 编辑:程序博客网 时间:2024/06/04 19:12
怎么会有可重入和不可重入的概念呢?
在多任务系统下,中断可能在任务执行的任何时间发生;如果一个函数的执行期间被中断后,到重新恢复到断点进行执行的过程中,函数所依赖的环境没有发生改变,那么这个函数就是可重入的,否则就不可重入。
在中断前后不都要保存和恢复上下文吗,怎么会出现函数所依赖的环境发生改变了呢?
我们知道中断时确实保存一些上下文,但是仅限于返回地址,cpu寄存器等之类的少量上下文,而函数内部使用的诸如全局或静态变量,buffer等并不在保护之列,所以如果这些值在函数被中断期间发生了改变,那么当函数回到断点继续执行时,其结果就不可预料了。
满足下面条件之一的多数是不可重入函数:
(1)使用了静态数据结构;
(2)调用了malloc或free;
(3)调用了标准I/O函数;
(4)进行了浮点运算.
malloc/free是不可重入的,它们使用了全局变量来指向空闲区;标准I/O库的很多实现都使用了全局数据结构; 许多的处理器/编译器中,浮点一般都是不可重入的 (浮点运算大多使用协处理器或者软件模拟来实现)。
在信号处理程序及多线程编程时,要特别注意。
考虑这种情况:
1) 信号处理程序A内外都调用了同一个不可重入函数B;B在执行期间被信号打断,进入A (A中调用了B),完事之后返回B被中断点继续执行,这时B函数的环境可能改变,其结果就不可预料了。
2) 多线程共享进程内部的资源,如果两个线程A,B调用同一个不可重入函数F,A线程进入F后,线程调度,切换到B,B也执行了F,那么当再次切换到线程A时,其调用F的结果也是不可预料的。
在信号处理程序中即使调用可重入函数也有问题要注意。作为一个通用的规则,当在信号处理程序中调用可重
入函数时,应当在其前保存errno,并在其后恢复errno。(要了解经常被捕捉到的信号是SIGCHLD,其信号处理程序通常要调用一种wait函数,而各种wait函数都能改变errno。)
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- EasyMock 使用方法与原理剖析
- 二叉查找树之插入算法
- struts2 Dispatch 的问题
- 扎根CSDN
- GCD介绍(一): 基本概念和Dispatch Queue
- 不可重入与可重入函数
- 【Mysql学习笔记】浅析mysql的binlog
- C#调用WebService实现天气预报
- 前言
- easy_install与pip 区别
- 第7周项目:任意输入两个数(实数),求出它们的和差积商
- 2013 考场改革后第一次学车
- 自动化测试人员的发展出路
- CUDA, 用于大量数据的超级运算:第七节