gmtime_r和gmtime_s之间的区别

时间:2013-09-27 13:15:57

标签: c++ time thread-safety

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

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

2 个答案:

答案 0 :(得分:17)

区别在于gmtime_r(3)standard SUSv2 function。在Windows环境中,您可以找到距gmtime_r()最近的gmtime_s(),其参数相反:

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

基本上,它们都将时间值转换为tm结构。 gmtime_r然后返回指向此结构的指针(如果失败则返回NULL),而gmtime_s如果成功则返回0,如果失败则返回errno_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 */
};

答案 1 :(得分:9)

gmtime_rlocaltime_r是标准的POSIX函数。

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

gmtime_slocaltime_s由Microsoft引入,现在是C11的一部分,尽管non-Microsoft support is limited。 (有关进一步的讨论,请参阅here。)

他们的主要目的是安全。它们是Microsoft的Secure CRT(安全C运行时)的一部分。据我所知,在Microsoft的CRT中,线程安全性不是问题gmtimelocaltime,因为这些函数的静态输出区域已经为每个线程分配。相反,我添加了gmtime_slocaltime_s来执行安全CRT的parameter validation。 (换句话说,它们检查它们的参数是否为NULL,在这种情况下它们会调用错误处理。)