下面这段代码有什么问题 CKSTime gKSTime; pthread_mutex_t m_lock; CKSTime * CKSTime::GetCurrentTime() { static unsigned long lasttick=0; pthread_mutex_lock(&m_lock); unsigned long tick = ::GetTickCount(); if (lasttick==0) lasttick=tick; if (tick==m_LastTick) { pthread_mutex_unlock(&m_lock); return(this); } if (tick>m_LastTick && (tick-lasttick)<10000) { int dtick = tick-m_LastTick+m_MSecond; m_LastTick = tick; m_MSecond = dtick%1000; dtick = dtick/1000+m_Second; m_Second = dtick%60; dtick = dtick/60+m_Minute; m_Minute = dtick%60; dtick = dtick/60+m_Hour; if (dtick<24) { m_Hour = dtick; pthread_mutex_unlock(&m_lock); return(this); } } lasttick=tick; ReflushTime(); pthread_mutex_unlock(&m_lock); return(this); } CKSTime *GetKSTime(void) { return gKSTime.GetCurrentTime(); } CKSTime::CKSTime() { pthread_mutex_init(&m_lock,NULL); pthread_mutex_lock(&m_lock); ReflushTime(); pthread_mutex_unlock(&m_lock); } CKSTime::~CKSTime() { pthread_mutex_destroy(&m_lock); } void CKSTime::ReflushTime() { pthread_mutex_lock(&m_lock); struct tm klgLocalTime; time_t now; time(&now); memcpy(&klgLocalTime, localtime(&now), sizeof(klgLocalTime)); m_LastTick = ::GetTickCount(); m_Year = klgLocalTime.tm_year + 1900 ; m_Month = klgLocalTime.tm_mon + 1 ; m_Day = klgLocalTime.tm_mday; m_WeekDay = klgLocalTime.tm_wday; m_Hour = klgLocalTime.tm_hour; m_Minute = klgLocalTime.tm_min; m_Second = klgLocalTime.tm_sec; m_MSecond = m_LastTick%1000; pthread_mutex_unlock(&m_lock); } void CKSTime::ReflushTime2(void) { pthread_mutex_lock(&m_lock); ReflushTime(); pthread_mutex_unlock(&m_lock); }
时间: 2024-04-13 21:27:37 浏览: 174
这段代码存在一些问题:
1. 没有在使用 pthread_mutex_t 前进行初始化,可以在 CKSTime 构造函数中添加初始化代码 `pthread_mutex_init(&m_lock, NULL);`。
2. 在 `CKSTime::GetCurrentTime()` 函数中,没有考虑到 `m_LastTick` 的更新问题。在 `if (tick==m_LastTick)` 条件下,应该先解锁互斥锁再返回;否则,互斥锁会一直被持有,可能导致死锁。
3. 在 `CKSTime::GetCurrentTime()` 函数中,存在时间计算错误。当 `(tick>m_LastTick && (tick-lasttick)<10000)` 条件满足时,应该更新 `m_LastTick` 的值为 `tick`,而不是 `m_LastTick = tick`。此外,在进行时间计算时,应该先将 `m_MSecond` 累加到 `dtick` 中,再进行计算。
4. 在 `CKSTime::GetCurrentTime()` 函数中,需要对时间进行刷新的情况下,没有调用 `ReflushTime()` 函数。
5. `GetKSTime()` 函数中的代码 `return gKSTime.GetCurrentTime();` 可以简化为 `return &gKSTime;`。
6. 在 `CKSTime::ReflushTime()` 函数中,没有进行时间结构体的初始化,可以使用 `memset(&klgLocalTime, 0, sizeof(klgLocalTime));` 进行初始化。
7. 在 `CKSTime::ReflushTime()` 函数中,没有考虑到 `m_Year`、`m_Month`、`m_Day`、`m_WeekDay` 的更新问题。应该在更新这些成员变量之前先解锁互斥锁。
8. 在 `CKSTime::ReflushTime2()` 函数中,没有必要再次调用 `ReflushTime()` 函数,可以直接调用 `ReflushTime()` 即可。
阅读全文