如下3个函数中,localtime为不可重入,localtime_r可重入,加const为输入型参数,不加const为输出型参数。
1、struct tm *localtime(const time_t *timep);
2、struct tm *localtime_r(const time_t *timep, struct tm *result);
3、size_t strftime(char *s, size_t max, const char *format, const struct tm *tm);
(1)不可重入函数localtime。
这个函数在返回的时候,返回的是一个指针,实际的内存是localtime内部通过static申请的静态内存,所以通过localtime调用后的返回值不及时使用的话,很有可能被其他线程localtime调用所覆盖掉,比如CPU执行线程A时使用该函数获取后,准备打印,这时CPU进入线程B,线程B中正好调用localtime并执行,然后回到线程A中执行printf打印时间,这时线程A的时间被线程B调用的localtime覆盖了,导致得到错误的时间。如下代码,结果一样,是因为ptm与ptmEnd指针指向的是同一个指针地址空间。
- #include <iostream>
- #include <ctime>
- using namespace std;
- int main()
- {
- time_t tNow =time(NULL);
- time_t tEnd = tNow + 3600;
- struct tm* pt