找回密码
 注册
搜索
查看: 1331|回复: 14

[讨论] 请问什么时候必须用可重入函数

[复制链接]
发表于 2006-12-11 12:50:58 | 显示全部楼层 |阅读模式
我现在写代码都没有考虑到可重入的问题,请问什么情况下必须写可重入代码?
比如文件系统搜索文件名的函数,需要写成可重入的吗?
不懂,请大侠指教
发表于 2006-12-16 00:38:51 | 显示全部楼层
可重入的编写似乎不太重要,重要的是不可重入代码的编写
个人理解为:使用了全局,临界资源的,可能造成资源冲突的代码就应该写成不可重入的。
其实如果是单线程的代码基本不用考虑这个问题,除非中断处理很多又很复杂。。。
点评回复

使用道具 举报

发表于 2006-12-18 21:08:44 | 显示全部楼层
<DIV class=quote><B>以下是引用<I>codehat</I>在2006-12-16 0:38:51的发言:</B>
可重入的编写似乎不太重要,重要的是不可重入代码的编写
个人理解为:使用了全局,临界资源的,可能造成资源冲突的代码就应该写成不可重入的。
其实如果是单线程的代码基本不用考虑这个问题,除非中断处理很多又很复杂。。。</DIV>

[em13]反了吧。
点评回复

使用道具 举报

发表于 2006-12-19 09:16:35 | 显示全部楼层
<DIV class=quote><B>以下是引用<I>erichain</I>在2006-12-18 21:08:44的发言:</B>


[em13]反了吧。</DIV>




人家说的是正确的~~
点评回复

使用道具 举报

发表于 2006-12-19 12:24:29 | 显示全部楼层
可重入的代码应该没有记忆功能。

需不需要重入,与你采用的算法有关,需要递归算法的,一般需要写可重入函数。
点评回复

使用道具 举报

 楼主| 发表于 2006-12-20 11:46:53 | 显示全部楼层
还是没懂啊,[em13]
点评回复

使用道具 举报

发表于 2006-12-21 18:12:36 | 显示全部楼层
给你推荐一本书:C陷阱与缺陷 .
点评回复

使用道具 举报

发表于 2006-12-26 15:54:09 | 显示全部楼层
多个进程或线程同时调用一个函数,这时的函数就必须是了可重入函数了。
所以可重入的函数体内最好不要使用全局变量或者定义静态变量等,如果一定要使用就需要资源的互斥操作。
点评回复

使用道具 举报

发表于 2006-12-27 14:23:05 | 显示全部楼层
一个简单的方法就是上锁,在系统里做一个互斥管理,当一个函数进入的时候,排斥系统里不允许第二次进入。
mtk平台上GDI里很多函数就是这样处理的。

如果一定要重入,注意资源的使用。如全局变量,就可以尽量避免。
点评回复

使用道具 举报

发表于 2007-1-1 02:25:00 | 显示全部楼层
所谓可重入(reenterent)函数,是指函数体在同一时间可被同时多处调用,或者可自身递归调用。

ARM C(ADS或者RealView)或者PC VC所有函数都是可重入的,只有KEIL C51才有可重入与不可重入函数的定义关键字。

可重入函数被同时多次调用的时候所有函数体内局部变量都是动态分配了不同的RAM地址空间,同一个函数局部变量可能分配了多处RAM空间,所以对于内部变量,不会被随机改写。不可重入函数内部局部变量分配地址唯一且固定,虽然不可重入函数禁止重入(同时并发调用),但是如果同时调用的话编译器是不会告错的,只是内部局部变量会莫名其妙改写。

如果不是写51,则不要分可重入与不可重入,否则自己增添混乱。KEIL C51是为了节约RAM使用而增加了此分别,而这种C,不是标准C了

虽然写ARM C相对制约比51少的多,但是即使每个函数都是可重入的,也要分清是内部局部变量可重入,对于全局变量或者内部非挥发静态变量则本来就是不可重入,同时调用必然被改写。这点需要注意。有时候我们要利用此,把需要被改写的内部变量定义成不可挥发,或者浪费点RAM直接用全局变量代表;有时候我们要避免变量被改写,就要用函数体局部变量或者把全局变量用互斥消息量来限制使用状态[/COLOR]
点评回复

使用道具 举报

 楼主| 发表于 2007-1-4 13:05:37 | 显示全部楼层
还有问题请教:
一个函数既被这个进程调用,同时又被另一个进程调用,搞不懂,怎么知道哪个函数属于哪个进程呢?
点评回复

使用道具 举报

发表于 2007-1-6 09:38:33 | 显示全部楼层
写驱动程序的时候就要设计成可重入函数,所以避免定义全局量.尽量用局部变量.
无论哪个进程调用都可以的.
点评回复

使用道具 举报

发表于 2007-4-26 11:07:09 | 显示全部楼层
不可重入变成可重入,有三个方法:
1.全局变量换成局部变量
2.采用信号量
3,CALL 函数之前禁用中断,完了开中断.
[em05]
点评回复

使用道具 举报

发表于 2007-7-19 15:21:00 | 显示全部楼层
我觉得很奇怪啊,我们的项目里面有一堆全局变量呢!
点评回复

使用道具 举报

发表于 2009-7-11 00:56:17 | 显示全部楼层
mark!!!
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-10-6 12:25 , Processed in 0.069137 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表