• localtime 和 localtime_r 的区别


    转自:http://blog.csdn.net/maocl1983/article/details/6221810
    #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;
    }
    
    
    最后出来的结果是:21:18:39 21:18:39  和最初想法不一致。查阅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。  修改程序:
    #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);
        struct tm ptm = { 0 };
        struct tm ptmEnd = { 0 };
        localtime_r(&tNow, &ptm);
        localtime_r(&tEnd, &ptmEnd);
        
        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;
    }
    
    最后出来的结果是:10:29:06  10:59:06  
  • 相关阅读:
    ES6~Promise的原理及使用二 理解Promise规范(copy自:https://www.cnblogs.com/lvdabao/p/5320705.html?utm_source=tuicool&utm_medium=referral)
    Google的Python代码格式化工具YAPF详解
    在ubuntu上使用QQ的经历
    Ubuntu 14.04 下安装Skype
    pip install lxml mysql-python error
    情人节的宠物-测试小工具
    戴维营收集
    工作日志(10.29)
    求职面试
    面试题集(转载)
  • 原文地址:https://www.cnblogs.com/zendu/p/4991078.html
Copyright © 2020-2023  润新知