c函数编写规范.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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( );? // 信号),本进程必须等待其释放信号后,才可继 ? ??? [释放信号量操作]??????? // 续执行。若申请到信号,则可继续执行,但其? ??????????????????????????? // 它进程必须等待本进程释放

文档评论(0)

xjj2017 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档