linux時間和定時器zz
阿新 • • 發佈:2017-12-02
一段時間 納秒 target 程序 set 不能 ive thread 微秒
https://www.cnblogs.com/cobbliu/p/3627061.html
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
- getitimer / setitimer
- timer_create / timer_settime / timer_gettime / timer_delete
- timerfd_create / timerfd_gettime / timerfd_settime
- 條件變量pthread_cond_timedwait實現
- IO多路復用select, epoll實現
一般情況下,獲取當前時間常用gettimerofday,因為它的精度是1us,並且在x86平臺上它是用戶態實現的,沒有系統調用和上下文切換的開銷。
定時函數中:
- sleep / alarm在實現時有可能用了信號 SIGALRM,在多線程程序中處理信號是個相當麻煩的事情,應當盡量避免。
- nanosleep 和 clock_nanosleep 是線程安全的,但是在非阻塞網絡編程中,絕對不能用讓線程掛起的方式來等待一段時間,程序會失去響應。正確的做法是註冊一個時間回調函數。
- getitimer 和 timer_create 也是用信號來 deliver 超時,在多線程程序中也會有麻煩。timer_create 可以指定信號的接收方是進程還是線程,算是一個進步,不過在信號處理函數(signal handler)能做的事情實在很受限。
- timerfd_create 把時間變成了一個文件描述符,該“文件”在定時器超時的那一刻變得可讀,這樣就能很方便地融入到 select/poll 框架中,用統一的方式來處理 IO 事件和超時事件。
- 利用select, epoll的timeout實現定時功能,它們的缺點是定時精度只有毫秒,遠低於 timerfd_settime 的定時精度。
linux時間和定時器zz