localtime线程不安全 以及 localtime

您所在的位置:网站首页 mktime函数 localtime线程不安全 以及 localtime

localtime线程不安全 以及 localtime

2023-04-13 16:54| 来源: 网络整理| 查看: 265

1)、localtime用来获取系统时间,精度为秒 #include #include int main() {time_t time_seconds = time(0);struct tm* now_time = localtime(&time_seconds);printf("%d-%d-%d %d:%d:%d\n", now_time->tm_year + 1900, now_time->tm_mon + 1,now_time->tm_mday, now_time->tm_hour, now_time->tm_min,now_time->tm_sec); }

函数原型为struct tm *localtime(const time_t * timep)

需要包含头文件:#include struct tm的结构为

  int tm_sec;       /* 秒 – 取值区间为[0,59] */           int tm_min;       /* 分 - 取值区间为[0,59] */           int tm_hour;      /* 时 - 取值区间为[0,23] */           int tm_mday;     /* 一个月中的日期 - 取值区间为[1,31] */           int tm_mon;       /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */           int tm_year;        /* 年份,其值等于实际年份减去1900 */           int tm_wday;      /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */           int tm_yday;       /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */           int tm_isdst;      /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/

(2)localtime_r也是用来获取系统时间,运行于linux平台下

函数原型为struct tm *localtime_r(const time_t *timep, struct tm *result);

#include #include int main() {time_t time_seconds = time(0);struct tm now_time;localtime_r(&time_seconds, &now_time);printf("%d-%d-%d %d:%d:%d\n", now_time.tm_year + 1900, now_time.tm_mon + 1,now_time.tm_mday, now_time.tm_hour, now_time.tm_min, now_time.tm_sec);} (3)localtime_s也是用来获取系统时间,运行于windows平台下,与localtime_r只有参数顺序不一样 #include #include int main() {time_t time_seconds = time(0);struct tm now_time;localtime_s(&now_time,&time_seconds);printf("%d-%d-%d %d:%d:%d\n", now_time.tm_year + 1900, now_time.tm_mon + 1,now_time.tm_mday, now_time.tm_hour, now_time.tm_min, now_time.tm_sec); }

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

        在localtime_s与localtime_r调用时,定义的是struct tm的结构体,获取到的时间已经保存在struct tm中,并不会受其他线程的影响。

(4)mktime 把struct tm转成time_t time_t ToTime_t(const char* str) {int year, month, day, hour, min, second;sscanf(str, "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &min, &second);struct tm t;t.tm_year = year - 1900;t.tm_mon = month - 1;t.tm_mday = day;t.tm_hour = hour;t.tm_min = min;t.tm_sec = second;return mktime(&t); }



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3