Muduo 網路編程樣本(三)定時器

來源:互聯網
上載者:User

程式中的時間

程式中對時間的處理是個大問題,我打算單獨寫一篇文章來全面地討論這個問 題。文章暫訂名《〈程式中的日期與時間〉第二章 計時與定時》,跟《〈程式中的日期與時間〉第一 章 日期計算》放到一個系列,這個系列預計會有四篇文章。

在這篇部落格裡裡我先簡要談談與編 程直接相關的內容,把更深入的內容留給上面提到的日期與時間專題文章。

在一般的服務端程式設計中,與時間有關的常見任務有:

1. 擷取目前時間,計算時間間隔 ;

2. 時區轉換與日期計算;把紐約當地時間轉換為上海當地時間;2011-02-05 之後第 100 天 是幾月幾號星期幾?等等

3. 定時操作,比如在預定的時間執行一項任務,或者在一段延時之後 執行一項任務。

其中第 2 項看起來複雜,其實最簡單。日期計算用 Julian Day Number,時區 轉換用 tz database;惟一麻煩一點的是夏令時,但也可以用 tz database 解決。這些操作都是純函 數,很容易用一套單元測試來驗證代碼的正確性。需要特別注意的是,用 tzset/localtime_r 來做時 區轉換在多線程環境下可能會有問題;對此我的解決辦法是寫一個 TimeZone class,以避免影響全域 ,將來在日期與時間專題中會講到。以下本文不考慮時區,均為 UTC 時間。

真正麻煩的是第 1 項和第 3 項。一方面,Linux 有一大把令人眼花繚亂的與時間相關的函數和結構體,在程式中該如何 選用?另一方面,電腦中的時鐘不是理想的計時器,它可能會漂移或跳變;最後,民用的 UTC 時間 與閏秒的關係也讓定時任務變得複雜和微妙。當然,與系統目前時間有關的操作也讓單元測試變得困難 。

Linux 時間函數

Linux 的計時函數,用於獲得目前時間:

* time(2) / time_t (秒 )

* ftime(3) / struct timeb (毫秒)

* gettimeofday(2) / struct timeval (微 秒)

* clock_gettime(2) / struct timespec (納秒)

* gmtime / localtime / timegm / mktime / strftime / struct tm (這些與目前時間無關)

定時函數,用於讓程式等 待一段時間或安排計劃任務:

* sleep

* alarm

* usleep

* nanosleep

* clock_nanosleep

* getitimer / setitimer

* timer_create / timer_settime / timer_gettime / timer_delete

* timerfd_create / timerfd_gettime / timerfd_settime

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。