在多線程的應(yīng)用中要用到延時(shí)函數(shù),,開始時(shí)我只用到 sleep 這個(gè)秒級(jí)函數(shù),,但在 solaris 上跑時(shí),,程序運(yùn)行到sleep時(shí),卻顯示 “Alarm clock” 這句話后就中止了。據(jù)說是產(chǎn)生了 alarm 這個(gè)信號(hào),,而系統(tǒng)默認(rèn)信號(hào)處理就是中止程序,所以要在程序中把這個(gè)設(shè)置為忽略:
unix 上的延時(shí)函數(shù)有好幾種: 引用
一、 基礎(chǔ)知識(shí) 1,、時(shí)間類型。Linux下常用的時(shí)間類型有4個(gè):time_t,,struct timeval,,struct timespec,struct tm,。 (1)time_t是一個(gè)長(zhǎng)整型,,一般用來表示用1970年以來的秒數(shù)。 (2)Struct timeval有兩個(gè)成員,,一個(gè)是秒,,一個(gè)是微妙。
(3)struct timespec有兩個(gè)成員,一個(gè)是秒,,一個(gè)是納秒,。
(4)struct tm是直觀意義上的時(shí)間表示方法:
2、 時(shí)間操作 (1) 時(shí)間格式間的轉(zhuǎn)換函數(shù) 主要是 time_t,、struct tm,、時(shí)間的字符串格式之間的轉(zhuǎn)換??聪旅娴暮瘮?shù)參數(shù)類型以及返回值類型:
gmtime和localtime的參數(shù)以及返回值類型相同,,區(qū)別是前者返回的格林威治標(biāo)準(zhǔn)時(shí)間,后者是當(dāng)?shù)貢r(shí)間,。 (2) 獲取時(shí)間函數(shù) 兩個(gè)函數(shù),,獲取的時(shí)間類型看原型就知道了:
前者獲取time_t類型,后者獲取struct timeval類型,,因?yàn)轭愋偷木壒?,前者只能精確到秒,后者可以精確到微秒,。 二,、 延遲函數(shù) 主要的延遲函數(shù)有:sleep(),usleep(),nanosleep(),select(),pselect().
alarm函數(shù)是信號(hào)方式的延遲,這種方式不直觀,,這里不說了,。 僅通過函數(shù)原型中時(shí)間參數(shù)類型,可以猜測(cè)sleep可以精確到秒級(jí),,usleep/select可以精確到微妙級(jí),,nanosleep和pselect可以精確到納秒級(jí)。 而 實(shí)際實(shí)現(xiàn)中,,linux上的nanosleep和alarm相同,,都是基于內(nèi)核時(shí)鐘機(jī)制實(shí)現(xiàn),受linux內(nèi)核時(shí)鐘實(shí)現(xiàn)的影響,,并不能達(dá)到納秒級(jí)的精度,, man nanosleep也可以看到這個(gè)說明,man里給出的精度是:Linux/i386上是10 ms ,,Linux/Alpha上是1ms,。 這里有一篇文章http://blog.csdn.net/zhoujunyi/archive/2007/03/30/1546330.aspx, 測(cè)試了不同延遲函數(shù)之間的精確度,。文章給出的結(jié)論是linux上精度最高的是select,,10ms級(jí)別,。我在本機(jī)器測(cè)試select和pselect相 當(dāng),,都達(dá)到了1ms級(jí)的精度,,精度高于文章中給出的10ms,,sleep在秒級(jí)以上和usleep/nanosleep相當(dāng)。下面貼下我機(jī)器上1ms時(shí)候 的測(cè)試結(jié)果,,其他不貼了:
而使用gettimeofday循環(huán)不停檢測(cè)時(shí)間,,可精確微秒級(jí),不過不適宜用來做定時(shí)器模塊,。 因此后面的定時(shí)期模塊將選擇select為延遲函數(shù),。 本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/wbj1234566/archive/2008/05/13/2442264.aspx 我在用 usleep 時(shí)卻發(fā)現(xiàn)有部分線程完全在等待中,,沒有醒過來, 最后換用了 nanosleep 正?;亓恕W⒁?要調(diào)用 nanosleep, 編譯時(shí)要帶 -lposix4 nanosleep 的例子(來自http://hi.baidu.com/zengzhaonong/blog/item/2fa4a799e282bb096f068c62.html)
|
|