ACE_Time_Value使用注意事項

ACE自定義了一個重要的時間類ACE_Time_Value來管理與時間相關的數據:

/**
 * @class ACE_Time_Value
 *
 * @brief Operations on "timeval" structures, which express time in
 * seconds (secs) and microseconds (usecs).
 *
 * This class centralizes all the time related processing in
 * ACE.  These time values are typically used in conjunction with OS
 * mechanisms like <select>, <poll>, or <cond_timedwait>.
 */
class ACE_Export ACE_Time_Value

。。。

 

這個類在很多地方要用到,比如我們經常使用絕對時間來做超時判斷等:

ACE_Time_Value tv = ACE_OS::gettimeofday() + ACE_Time_Value(1);//當前時間過1秒
                   
if (m_task.putq(mb, &tv) == -1)

{

    //m_task消息隊列插入失敗

    ...

}

 

在與這個時間類相關的使用中,有幾個特別需要注意的問題:

 

1、 經常通過ACE_Time_Value類來保存絕對時間或相對時間,用其msec()成員函數可以返回它對應時間的毫秒值,msec()函數返回類型是long,而不是unsigned long,所以它的值可能爲負,爲避免這個情況,請把它轉換爲無符號數來使用。比如:

    取得當前絕對時間對應的毫秒值:

    unsigned long lCurTime = (unsigned long)(ACE_OS::gettimeofday().msec());

    保存相對時間:

    ACE_Time_Value tv(100, 0);//構造一個100秒的時間

 

2、msec()函數返回值轉換成無符號數之後,其取值範圍0~0xFF FF FF FF, 即0~4294967295毫秒,也就是4294967295/1000/3600/24=49.71天!

    這也就是說,這個值每過49天就會歸0一次,如果你有功能要通過這個值來判斷時間大小或計算時間差,必須小心這個問題。因爲這種問題49天才會發生一次,一般很難遇到;等發生了,一重啓又會消失,屬於特別難查的問題!

 

3、 更改操作系統時間除了導致ACE計時器(比如通過ACE_Reactor::instance()->schedule_timer註冊的計時器)調度發生混亂(比如你把系統時間調大,很可能導致計時器事件長期不產生!),還會導致ACE_OS::gettimeofday()之類的操作取值發生變化,這也會導致計算時間差之類的功能發生異常。所以華爲T2000網管明確規定,服務運行期間不能更改系統時間!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章