- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
c函数编写规范
c函数编写规范 收藏
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 操作
)等手段对其加以保护?
说明:若对所使用的全局变量不加以保护,则此函数就不具有可重入性,即当多个进
程调用此函数时,很有可能使有关全局变量变为不可知状态。?
示例:假设Exam是int型全局变量,函数Squre_Exam返回Exam平方值。那么如下函数
不具有可重入性。?
unsigned int example( int para )?
{?
??? unsigned int temp;?
??? Exam = para; // (**)?
??? temp = Square_Exam( );?
??? return temp;?
}?
此函数若被多个进程调用的话,其结果可能是未知的,因为当(**)语句刚执行完后
,另外一个使用本函数的进程可能正好被激活,那么当新激活的进程执行到此函数时
,将使Exam赋与另一个不同的para值,所以当控制重新回到temp = Square_Exam(?
)后,计算出的temp很可能不是预想中的结果。此函数应如下改进。?
unsigned int example( int para )?
{?
??? unsigned int temp;?
??? [申请信号量操作]??????? // 若申请不到信号量,说明另外的进程正处于?
??? Exam = para;??????????? // 给Exam赋值并计算其平方过程中(即正在使用此
?
??? temp = Square_Exam( );? // 信号),本进程必须等待其释放信号后,才可继
?
??? [释放信号量操作]??????? // 续执行。若申请到信号,则可继续执行,但其?
??????????????????????????? // 它进程必须等待本进程释放
您可能关注的文档
最近下载
- 妇产科-自然流产教案.docx VIP
- 2025年秋新教科版三年级上册科学全册精编教案教学设计(新教材).docx
- 促进母乳喂养成功课件.pptx VIP
- 2025秋教科版(2024)科学二年级上册第一单元《我们的家》教学设计.docx VIP
- 英语口语8000句(最全版本).pdf
- 医院耳穴学习班国标考核试题.pdf
- 《活动挂物架的制作--定位和钻孔》ppt劳技教学课件.pptx VIP
- 2025云南怒江州福贡县义务教育教师专项招聘65人笔试模拟试题及答案解析.docx VIP
- 小学综合实践课程标准新版.pdf VIP
- 2025怒江州福贡县义务教育教师专项招聘(65人)笔试备考试题及答案解析.docx VIP
文档评论(0)