可重入函数(简单解析,仅供参考)
来源:互联网 发布:学平面设计的软件 编辑:程序博客网 时间: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、任务变量================对于这个概念 我理解不是很清晰,不便多说
- 可重入函数(简单解析,仅供参考)
- 简单java定时任务,(仅供参考)
- C++虚函数学习笔记(仅供参考)
- 简单小布局,仅供参考
- rockdb 源码解析:Log文件结构 (仅供参考)
- 简单教教大家如何移植MIUI。(仅供参考)!!!
- 动态域名解析【个人笔记,仅供参考】
- syslog() 函数简单解析
- NtQuerySystemInformation 函数简单解析
- Printk函数简单解析
- 中国大学排行榜(仅供参考)
- 翻译(汉译英) 仅供参考
- 软件工程复习资料(仅供参考)
- windows常用命令(仅供参考)
- 仅供参考
- Hibernate性能测试(load10000条记录的简单测试 仅供参考)
- Directshow学习笔记五-----一个简单的视频播放程序(个人学习总结,仅供参考)
- 一个简单的“编码解码”,仅供参考
- linux ssh安全加固方法
- 轻松搞定你的RedHat安全加固
- Linux动态链接库.so文件的创建与使用
- 新手学Python 第十一篇 函数(一)
- linux下vi命令大全
- 可重入函数(简单解析,仅供参考)
- 查看列重复行的数据
- 动态规划一
- Web开发中,JS是如何加载的?JS应该放在什么位置
- win7 32系统 安装oracle 出现 未知错误 解决方案
- Struts2中的特殊符号#%$
- QoS优先级详解
- 轻松解决 Eclipse Indigo 3.7 中文字体偏小,完美 Consolas 微软雅黑混合字体!
- 【玩转cocos2d-x之十六】滚动字幕和公告