20.36 怎樣實現精度小於秒的延時或記錄用戶回應的時間?

很不幸, 這沒有可移植解決方法。下面是一些你可以在你的系統中尋找 的函數: clock(), delay(), ftime(), getimeofday(), msleep(), nap(), napms(), nanaosleep(), setitimer(), sleep(), Sleep(), times() 和  usleep。至少在 Unix 系統下, 函數 wait() 不是 你想要的。函數 select() 和 poll() (如果存在) 可以用來實現簡單的延時。在 MS-DOS 下, 可以重新對系統計時器 和計時器中斷編程。

這些函數中, 只有 clock() 在 ANSI 標準中。兩次調用  clock() 之間的差分就是執行所用的時間, 如果  CLOCKS_PER_SEC 的值大於 1, 你可以得到精確度小於秒 的計時。但是, clock()  返回的是執行程序使用的處理器的時間, 在多任務系統下, 有可能 和真實的時間相差很多。

如果你需要實現一個延時, 而你只有報告時間的函數可用, 你可以 實現一個繁忙等待。但是這只是在單用戶, 單任務系統下可選, 因為這個方法對於其它進程極不友好。在多任務系統下, 確保你 調用函數, 讓你的進程在這段時間進入休眠狀態。可用函數   sleep(), select() 或 poll() 和  alarm() 或 setitimer()實現。

對於非常短暫的延時, 使用一個空循環頗據有誘惑力:

    long int i;
    for (i = 0; i < 1000000; ++i)
	;
但是請盡量抵制這個誘惑!因為, 經過你仔細計算的延時循環可能 在下個月因為更快的處理器出現而不能正常工作。更糟糕的是, 一個聰明的編譯器可能注意到這個循環什麼也沒做, 而把它完全優化 掉。

參考資料: [H&S, Sec. 18.1 pp. 398-9]; [PCS, Sec. 12 pp. 197-8,215-6]; [POSIX, Sec. 4.5.2]。

翻譯朱群英、孫雲, LaTeX2HTML 編譯 朱群英 (2005-06-23)