问题:
查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 应该也会有这种问题。。
本文探讨了localtime和localtime_r函数在处理时间转换时的区别,特别是针对多线程环境下的安全性问题。通过实例说明了localtime可能引发的问题,并推荐在多线程环境中使用localtime_r。

1500

被折叠的 条评论
为什么被折叠?



