电脑桌面
添加小米粒文库到电脑桌面
安装后可以在桌面快捷访问

C语言函数可重入性及编写规范

C语言函数可重入性及编写规范_第1页
1/9
C语言函数可重入性及编写规范_第2页
2/9
C语言函数可重入性及编写规范_第3页
3/9
一、可重入函数 1)什么是可重入性? 可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反, 不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。 2)可重入函数: 不为连续的调用持有静态数据。 不返回指向静态数据的指针;所有数据都由函数的调用者提供。 使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。 如果必须访问全局变量,记住利用互斥信号量来保护全局变量。 绝不调用任何不可重入函数。 3)不可重入函数: 函数中使用了静态变量,无论是全局静态变量还是局部静态变量。 函数返回静态变量。 函数中调用了不可重入函数。 函数体内使用了静态的数据结构; 函数体内调用了 malloc()或者 free()函数; 函数体内调用了其他标准 I/O 函数。 函数是 singleton 中的成员函数而且使用了不使用线程独立存储的成员变量 。 总的来说,如果一个函数在重入条件下使用了未受保护的共享的资源,那么它是不可重入的。 4)示例 在多线程条件下,函数应当是线程安全的,进一步,更强的条件是可重入的。可重入函数保证了在多线程条件下,函数的状态不会出现错误。以下分别是一个不可重入和可重入函数的示例: //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,这样状态就错了。 二、函数编写规范 1 :对所调用函数的错误返回码要仔细、全面地处理 2 :明确函数功能,精确(而不是近似)地实现函数设计 3 :编写可重入函数时,应注意局部变量的使用(如编写 C/C++ 语言的可重入函数时,应使用 auto 即缺省态局部变量或寄存器变量) 说明:编写 C/C++语言的可重入函数时,不应使用 static 局部变量,否则必须经过特殊处理,才能使函数具有可重入性。 4 :编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即 P 、V 操作)等手段对其加以保护 ...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

C语言函数可重入性及编写规范

确认删除?
VIP
微信客服
  • 扫码咨询
会员Q群
  • 会员专属群点击这里加入QQ群
客服邮箱
回到顶部