gmtime_r和gmtime_s之间的区别

elv*_*kaj 18 c++ time thread-safety

这两个功能有什么区别?我正在使用MinGW 4.8.0.

我知道这gmtime_r是线程安全的(但如果从同一个线程多次调用,则不安全),但我不明白gmtime_s

Nat*_*pel 18

不同之处在于它gmtime_r(3)标准的SUSv2功能.您可以gmtime_r()在Windows环境中找到最接近的gmtime_s(),其参数相反:

  • gmtime_r(const time_t*, struct tm*)
  • gmtime_s(struct tm*, const time_t*)

基本上,它们都将时间值转换为tm结构.gmtime_r然后返回指向此结构的指针(或者NULL如果失败),如果成功则gmtime_s返回,如果失败则返回.0errno_t

tm结构具有以下体,如可从以上列出的两个文档中可以看出:

struct tm {
    int tm_sec;         /* seconds */
    int tm_min;         /* minutes */
    int tm_hour;        /* hours */
    int tm_mday;        /* day of the month */
    int tm_mon;         /* month */
    int tm_year;        /* year */
    int tm_wday;        /* day of the week */
    int tm_yday;        /* day in the year */
    int tm_isdst;       /* daylight saving time */
};
Run Code Online (Sandbox Code Playgroud)


Jos*_*ley 10

gmtime_r并且localtime_r是标准的POSIX功能.

它们的主要目的是线程安全(重入).基本gmtimelocaltime函数不是线程安全的或可重入的,因为它们使用单​​个静态区域来存储结果,因此gmtime_rlocaltime_r指出应该存储结果的位置.

gmtime_slocaltime_s被微软介绍,现在C11的一部分,虽然非微软的支持是有限的.(见这里进一步讨论.)

他们的主要目的是安全.它们是Microsoft的Secure CRT(Secure C Run-Time)的一部分.据我了解,线程安全是不是有问题gmtime,并localtime在微软的CRT,因为这些功能静态输出区域,每个线程已经分配.相反,gmtime_slocaltime_s被添加到Secure CRT的参数验证中.(换句话说,它们检查它们的参数是否为NULL,在这种情况下它们会调用错误处理.)