【cdk的使用】C标准库函数localtime()的问题

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版权协议,转载请附上原文出处链接和本声明。