可重入函数(简单解析,仅供参考)

来源:互联网 发布:学平面设计的软件 编辑:程序博客网 时间:2024/06/07 08:31

概念:

可重入函数:一个函数,被多个任务同时调用时,不用担心数据会发生错误的函数-------------------------该定义是我自己定义的仅供参考

概念解析:

满足上面的概念的情况有下面几种(对于linux而言):

1、除了使用自己栈上的变量以外不依赖其他的static环境资源

2、若一定要使用全局变量,一定要试试保护手段,如:加锁,信号量等多种方式

 

主要:可重入在并行环境中非常重要,若要访问全局变量时,由于要做保护的措施,因而会损失一些性能代价;在实时操作系统中(如:vxworks)不可重入函数,是被认为是不安全的函数(可以理解,若在航空或军用领域,出现中断,若出现不可重入函数,那将是致命的)

 

对于linux而言不可重入函数有一下几类(可能不完整,欢迎一起讨论):

1、函数使用了静态数据结构;

如:全局变量,静态局部变量(这里包活返回的也是static的值)而没有实施保护措施的函数

 

2、函数调用了malloc和free

对于这个问题,我只能肤浅的理解,以下解释仅供参考:

malloc函数在分配堆空间时,维持一个内存链表(在malloc的时候分配的内存可能不是连续的,跟我们链式存储类似),当我在malloc的同时,如果发生多个任务调度,或者是中断时,后一个malloc可能会破坏前一个malloc的数据结构(如;前一个可能正在修改内存链表,后一个malloc刚好分配了前一个malloc的修改点的内存,可能导致内存数据结构出错,从而导致数据出错)

 

3、函数调用了标准I/O

这里我个人觉得除了标准I/O还应该有文件I/o,如下解释:

对于标准I/O是带缓冲区的I/O流,当我们在访问一个函数的流时(如:输出流),突然另一个任务也再访问这流,由于两个流公用一个缓冲区(这里可以理解为静态数据结构了),从而可能导致了数据出现错误

对于文件I/O;我个人觉得,由于文件描述符是内存的索引;在多线程中,由于主线程用了相同的文件描述符(如:0,1),可能同时访问一个快内存的索引,也即是访问同一个块内存,从而可能导致数据结构出现错误,也会导致数据出现错误。

 

 也考参照资源了解:http://www.ibm.com/developerworks/cn/linux/l-reent.html

对于vxworks,我在网上了解了,它用了一下几种方式来解决不可重入的问题:

1、动态的堆栈分配机制,即:每个函数有自己的堆栈空间

2、受保护的静态变量和全局变量

3、任务变量================对于这个概念 我理解不是很清晰,不便多说