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)