一、可重入函数20901

一、可重入函数20901

ID:15750427

大小:39.50 KB

页数:13页

时间:2018-08-05

一、可重入函数20901_第1页
一、可重入函数20901_第2页
一、可重入函数20901_第3页
一、可重入函数20901_第4页
一、可重入函数20901_第5页
资源描述:

《一、可重入函数20901》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、一、可重入函数20901读书之法,在循序而渐进,熟读而精思。——朱熹一、可重入函数1)什么是可重入性?可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反,不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。2)可重入函数:不为连续的调用持有静态数据。不返回指向静态数据的指针;所有数

2、据都由函数的调用者提供。使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。如果必须访问全局变量,记住利用互斥信号量来保护全局变量。绝不调用任何不可重入函数。3)不可重入函数:函数中使用了静态变量,无论是全局静态变量还是局部静态变量。函数返回静态变量。函数中调用了不可重入函数。函数体内使用了静态的数据结构;函数体内调用了malloc()或者free()函数;函数体内调用了其他标准I/O函数。函数是singleton中的成员函数而且使用了不使用线程独立存储的成员变量。总的来说,如果一个函数在重入条件下使用了未受保护的

3、共享的资源,那么它是不可重入的。4)示例在多线程条件下,函数应当是线程安全的,进一步,更强的条件是可重入的。可重入函数保证了在多线程条件下,函数的状态不会出现错误。以下分别是一个不可重入和可重入函数的示例://ccodestaticinttmp;voidfunc1(int*x,int*y){tmp=*x;*x=*y;*y=tmp;}voidfunc2(int*x,int*y){inttmp;tmp=*x;*x=*y;*y=tmp;}func1是不可重入的,func2是可重入的。因为在多线程条件下,操作系统会在func1还没

4、有执行完的情况下,切换到另一个线程中,那个线程可能再次调用func1,这样状态就错了。二、函数编写规范1:对所调用函数的错误返回码要仔细、全面地处理2:明确函数功能,精确(而不是近似)地实现函数设计3:编写可重入函数时,应注意局部变量的使用(如编写C/C++语言的可重入函数时,应使用auto即缺省态局部变量或寄存器变量)说明:编写C/C++语言的可重入函数时,不应使用static局部变量,否则必须经过特殊处理,才能使函数具有可重入性。4:编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以

5、保护说明:若对所使用的全局变量不加以保护,则此函数就不具有可重入性,即当多个进程调用此函数时,很有可能使有关全局变量变为不可知状态。示例:假设Exam是int型全局变量,函数Squre_Exam返回Exam平方值。那么如下函数不具有可重入性。unsignedintexample(intpara){unsignedinttemp;Exam=para;//(**)temp=Square_Exam();returntemp;}此函数若被多个进程调用的话,其结果可能是未知的,因为当(**)语句刚执行完后,另外一个使用本函数的进程可

6、能正好被激活,那么当新激活的进程执行到此函数时,将使Exam赋与另一个不同的para值,所以当控制重新回到"temp=Square_Exam()"后,计算出的temp很可能不是预想中的结果。此函数应如下改进。unsignedintexample(intpara){unsignedinttemp;[申请信号量操作]//若申请不到"信号量",说明另外的进程正处于Exam=para;//给Exam赋值并计算其平方过程中(即正在使用此temp=Square_Exam();//信号),本进程必须等待其释放信号后,才可继[释放信号量操

7、作]//续执行。若申请到信号,则可继续执行,但其//它进程必须等待本进程释放信号量后,才能再使//用本信号。returntemp;}5:在同一项目组应明确规定对接口函数参数的合法性检查应由函数的调用者负责还是由接口函数本身负责,缺省是由函数调用者负责说明:对于模块间接口函数的参数的合法性检查这一问题,往往有两个极端现象,即:要么是调用者和被调用者对参数均不作合法性检查,结果就遗漏了合法性检查这一必要的处理过程,造成问题隐患;要么就是调用者和被调用者均对参数进行合法性检查,这种情况虽不会造成问题,但产生了冗余代码,降低了效率

8、。6:防止将函数的参数作为工作变量说明:将函数的参数作为工作变量,有可能错误地改变参数内容,所以很危险。对必须改变的参数,最好先用局部变量代之,最后再将该局部变量的内容赋给该参数。示例:如下函数的实现就不太好。voidsum_data(unsignedintnum,int*data,int*sum){u

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。