慎用localtime等时间转换类函数

标签:开发规范   localtime   ctime   系统调用    2480人阅读 评论(0)
分类:

今天测试JCQ项目,3Gbps混合流量就持续性小量丢包,经过各种perf, top, 排除法定位,

最后在ctrl+c时,发现某个线程有锁等待,是因为调用了localtime, 类似的函数还有ctime等。


再看localtime函数调用上下文,是每个HTTP会话调用一次,虽不算太频繁,但已经导致了丢包,

其实这个坑若干年前就已经跳过,且已解决,已经有前人写了thread_safe_ctime(),

一是保证线程安全的,二是内部实现基本都是数值运算,是无锁的。


想起之前某个公司的内部开发规范,

 系统调用,也就是man page级别为2的函数,项目代码中都不允许直接用,必须经过二次封装之后才能使用!

 

库函数,和系统调用的区别,简述如下:

函数库调用

系统调用

在所有的ANSI C编译器版本中,C库函数是相同的

各个操作系统的系统调用是不同的

它调用函数库中的一段程序(或函数)

它调用系统内核的服务

与用户程序相联系

是操作系统的一个入口点

在用户地址空间执行

在内核地址空间执行

它的运行时间属于用户时间

它的运行时间属于系统时间

属于过程调用,调用开销较小

需要在用户空间和内核上下文环境间切换,开销较大

C函数库libc中有大约300个函数

UNIX中大约有90个系统调用

典型的C函数库调用:system fprintf malloc

典型的系统调用:chdir fork write

 

目前MESA开发规范还没这么严格的限定,以后会朝着这个方向努力的。

目前只是规定:

1-常用的socket函数,read, write, sendto等不允许直接调用

  这些函数需要精细的判断各种返回值及errno代码,做出相应错误处理,而不是返回-1就是错误。

  虽然localtime, ctime是属于库函数级别的,但以后也要慎用!

 

2-str系列函数都不允许使用,最低要求是使用strn系列函数,推荐使用mem系列函数代替。


最后一点,禁止个人随意造轮子,一定问问各位老师、同事、学长,类似功能是否已经有类似代码。

查看评论

暂无评论

发表评论
  • 评论内容:
      
首页
团队介绍
发展历史
组织结构
MESA大事记
新闻中心
通知
组内动态
科研成果
专利
论文
项目
获奖
软著
人才培养
MESA毕业生
MESA在读生
MESA员工
招贤纳士
走进MESA
学长分享
招聘通知
招生宣传
知识库
文章
地址:北京市朝阳区华严北里甲22号楼五层 | 邮编:100029
邮箱:nelist@iie.ac.cn
京ICP备15019404号-1