localtime 和 localtime_r

Posted dsw846

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了localtime 和 localtime_r相关的知识,希望对你有一定的参考价值。

#include <cstdlib>
#include <iostream>
#include <time.h>
#include <stdio.h>

using namespace std;

int main(int argc, char *argv[])
{
    time_t tNow =time(NULL);
    time_t tEnd = tNow + 1800;
    //注意下面两行的区别
    struct tm* ptm = localtime(&tNow);
    struct tm* ptmEnd = localtime(&tEnd);

    char szTmp[50] = {0};
    strftime(szTmp,50,"%H:%M:%S",ptm);
    char szEnd[50] = {0};
    strftime(szEnd,50,"%H:%M:%S",ptmEnd);
    
    printf("%s /n",szTmp);
    printf("%s /n",szEnd);
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

最后出来的结果是:

16:49:49
16:49:49

和最初想法不一致。

 

查阅localtime的文档,发现这段话:

This structure is statically allocated and shared by the functions gmtime and localtime. Each time either one of these functions is called the content of this structure is overwritten.

也就是说每次只能同时使用localtime()函数一次,要不就会被重写!

The localtime() function need not be reentrant. A function that is not required to be reentrant is not required to be thread-safe.

因此localtime()不是可重入的。同时libc里提供了一个可重入版的函数localtime_r();

Unlike localtime(), the reentrant version is not required to set tzname。

 

将location修改为location_r后,输出结果:

16:22:02
16:52:02

 

localtime是直接返回strcut tm*指针(如果成功的话);这个指针是指向一个静态变量的;因此,返回的指针所指向的静态变量有可能被其他地方调用的localtime改掉,例如多线程使用的时候。

localtime_r则是由调用者在第二个参数传入一个struct tm result指针,该函数会把结果填充到这个传入的指针所指内存里面;成功的返回值指针也就是struct tm result。

其他的时间函数,如asctime,asctime_r;ctime,ctime_r;gmtime,gmtime_r都是类似的,所以,时间函数的 _r 版本都是线程安全的。

 

以上是关于localtime 和 localtime_r的主要内容,如果未能解决你的问题,请参考以下文章

centos7(redhat7) 中localtime_r有一个BUG

localtime_r 的 C++11 替代方案

MinGW localtime_r 在一个时区工作,在另一个时区失败

Windows 上 localtime_s() 多线程性能不佳的解决方法

vs2013写c++程序,其中localtime_s函数不接受一个参数怎么解决?!

C语言编程函数localtime_s在VS 2020中写的程序参数错误,参数怎么写?