Github地址: https://github.com/wujin1989/cdk
localtime()函数的问题:不是Thread safety。
那么这个会有什么问题呢?毕竟大部分代码里好像都是用的localtime()。看下面的代码:
#include "cdk.h"
int main(void) {
time_t t1, t2;
struct tm* tm1;
struct tm* tm2;
t1 = time(NULL);
t2 = t1 + 3600;
tm1 = localtime(&t1);
tm2 = localtime(&t2);
printf("[tm1] %02d:%02d:%02d\n", tm1->tm_hour, tm1->tm_min, tm1->tm_sec);
printf("[tm2] %02d:%02d:%02d\n", tm2->tm_hour, tm2->tm_min, tm2->tm_sec);
return 0;
}
结果:tm1和tm2 输出相同的时间。
导致的原因是因为localtime返回的struct tm*是一个指向全局或者静态的变量。
所以,如果多线程调用localtime的时候要确保不会修改返回值,否则就会出上面的问题。
下面看下cdk_localtime()函数的结果:
#include "cdk.h"
int main(void) {
time_t t1, t2;
struct tm tm1;
struct tm tm2;
t1 = time(NULL);
t2 = t1 + 3600;
cdk_localtime(&t1, &tm1);
cdk_localtime(&t2, &tm2);
printf("[tm1] %02d:%02d:%02d\n", tm1.tm_hour, tm1.tm_min, tm1.tm_sec);
printf("[tm2] %02d:%02d:%02d\n", tm2.tm_hour, tm2.tm_min, tm2.tm_sec);
return 0;
}
结果:tm2比tm1快一个小时,符合预期。
怎么样?是不是很简单。快来尝试下吧!
版权声明:本文为u012675436原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。