localtime在多线程导致UTC-8的问题

本文探讨了localtime和localtime_r函数在处理时间转换时的区别,特别是针对多线程环境下的安全性问题。通过实例说明了localtime可能引发的问题,并推荐在多线程环境中使用localtime_r。

问题:
查log发现 每隔2分钟会出现 一次 UTC-8 的问题,在这里插入图片描述

如果有两个localtime调用
time_t tNow =time(NULL);
time_t tEnd = tNow + 1800;
//注意下面两行的区别
struct tm* ptm = localtime(&tNow);
struct tm* ptmEnd = localtime(&tEnd);
ptm和ptmEnd会指向同一内存,那么结果会是一样的,这一点,除了官方 英文呢 文档 和提到一点而已,别的文档 都找不到。
所以 建议使用 localtime_r ,除非 只使用一次并在非多线程进程中使用 localtime。

demo:

	struct timeval tv;
	struct tm tm_log;
	gettimeofday(&tv,NULL);
	localtime_r(&(tv.tv_sec),&tm_log);

为什么有了localtime还要有其他两个函数呢,因为localtime并不是线程安全的,观察localtime和localtime_r的调用发现,localtime在使用时,我们只需定义一个指针,并不需要为指针申请空间,而指针必须要指向内存空间才可以使用,其实申请空间的动作由函数自己完成,这样在多线程的情况下,如果有另一个线程调用了这个函数,那么指针指向的struct tm结构体的数据就会改变。
那么 asctime 和 gtime 应该也会有这种问题。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值