我的程序结构如下:
全局变量 struct tm *g_CurrentTm;
void a()
{
time_t Timep;
time(&Timep);
g_CurrentTm = gmtime(&Timep);
g_StartDay = (g_CurrentTm->tm_mday);
...
}
void thread()
{
time_t Timep;
time(&Timep);
//gmtime_r(&Timep, g_CurrentTm);
g_CurrentTm = gmtime(&Timep);
...
if((g_CurrentTm->tm_mday) != g_StartDay)
{
a();
}
...
}
其中,a()在程序启动时执行,获取系统当前时间。程序在运行过程中,会不断产生线程(线程函数thread())。在线程函数中,获得当前时间,与程序启动时间的时间进行比较,如果不相同,调用a()。以上程序运行没有问题,但如果将g_CurrentTm改为局部变量,或者使用gmtime_r函数代替gmtime,就会出段错误。请问这是为什么,使用gmtime需要注意些什么,如何能让使用gmtime_r的程序好使(因为程序是多线程的,gmtime不是线程安全的)
|
gmtime()返回的指针是系统指针,跟你的g_CurrentTm是全局或局部变量没关系,
如果将g_CurrentTm改为局部变量,会出段错误, 那肯定不是g_CurrentTm变量的问题。
/* Return the `struct tm' representation of *TIMER in UTC,
using *TP to store the result. */
extern struct tm *gmtime_r (__const time_t *__restrict __timer,
struct tm *__restrict __tp) __THROW;
gmtime_r()的参数__tp是需要你自己分配地址的。否则会coredump。