2022年2022年可重入函数与不可重入函数 .pdf
《2022年2022年可重入函数与不可重入函数 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年可重入函数与不可重入函数 .pdf(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、一、可重入函数1)什么是可重入性?可重入( reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反,不可重入( non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入函数可以在任意时刻被中断,稍后再继续运行, 不会丢失数据。 可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。2)可重入函数:不为连续的调用持有静态数据。不返回指向静态数据的指针;所有数据都由函数的调用者提供。使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。如果必须访问全局变量,记住利用互斥信号量来保护全
2、局变量。绝不调用任何不可重入函数。3)不可重入函数:函数中使用了静态变量,无论是全局静态变量还是局部静态变量。函数返回静态变量。函数中调用了不可重入函数。函数体内使用了静态的数据结构;函数体内调用了malloc()或者 free()函数;函数体内调用了其他标准I/O 函数。函数是 singleton 中的成员函数而且使用了不使用线程独立存储的成员变量。总的来说,如果一个函数在重入条件下使用了未受保护的共享的资源,那么它是不可重入的。4)示例在多线程条件下,函数应当是线程安全的,进一步,更强的条件是可重入的。可重入函数保证了在多线程条件下,函数的状态不会出现错误。以下分别是一个不可重入和可重入函
3、数的示例:/c code static int tmp; void func1(int* x, int* y) tmp=*x; *x=*y; *y=tmp; void func2(int* x, int* y) int tmp; tmp=*x; *x=*y; *y=tmp; func1 是不可重入的,func2 是可重入的。因为在多线程条件下,操作系统会在func1 还没有执行完的情况下,切换到另一个线程中,那个线程可能再次调用func1,这样状态就错了。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - -
4、- - - - 第 1 页,共 8 页 - - - - - - - - - 二、函数编写规范1 :对所调用函数的错误返回码要仔细、全面地处理2 :明确函数功能,精确(而不是近似)地实现函数设计3 :编写可重入函数时,应注意局部变量的使用(如编写C/C+ 语言的可重入函数时,应使用 auto 即缺省态局部变量或寄存器变量)说明: 编写 C/C+ 语言的可重入函数时,不应使用static 局部变量, 否则必须经过特殊处理,才能使函数具有可重入性。4 :编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P 、V 操作)等手段对其加以保护说明: 若对所使用的全局变量不加以保护,则此函数就不具
5、有可重入性,即当多个进程调用此函数时,很有可能使有关全局变量变为不可知状态。示例: 假设 Exam 是 int 型全局变量, 函数 Squre_Exam 返回 Exam 平方值。那么如下函数不具有可重入性。unsigned int example( int para ) unsigned int temp; Exam = para; / (* )temp = Square_Exam( ); return temp; 此函数若被多个进程调用的话,其结果可能是未知的,因为当(* )语句刚执行完后,另外一个使用本函数的进程可能正好被激活,那么当新激活的进程执行到此函数时,将使Exam赋与另一个不同的
6、para值, 所以当控制重新回到 “temp = Square_Exam( )” 后, 计算出的temp很可能不是预想中的结果。此函数应如下改进。unsigned int example( int para ) unsigned int temp; 申请信号量操作 / 若申请不到“信号量” ,说明另外的进程正处于Exam = para; / 给 Exam 赋值并计算其平方过程中(即正在使用此temp = Square_Exam( ); / 信号) ,本进程必须等待其释放信号后,才可继释放信号量操作 / 续执行。若申请到信号,则可继续执行,但其/ 它进程必须等待本进程释放信号量后,才能再使/ 用
7、本信号。return temp; 5 : 在同一项目组应明确规定对接口函数参数的合法性检查应由函数的调用者负责还是由接口函数本身负责,缺省是由函数调用者负责说明: 对于模块间接口函数的参数的合法性检查这一问题,往往有两个极端现象,即:要么是调用者和被调用者对参数均不作合法性检查,结果就遗漏了合法性检查这一必要的处理过名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 8 页 - - - - - - - - - 程,造成问题隐患; 要么就是调用者和被调用者均对参数进行合法性检查
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年2022年可重入函数与不可重入函数 2022 年可重入 函数 不可
限制150内