localtime多線下不安全,localtime_r線程安全


引用:http://blog.csdn.net/maocl1983/article/details/6221810

localtime的英文解析:

his 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();

 

#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

#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

 

 

mysql_real_query也是非線程安全的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM