prev up next   top/contents search

comp.lang.c FAQ 列表· 第 19.37 题

如何以亚秒级精度实现延迟或计时用户的响应?


不幸的是,没有通用的方法。您可以在系统中查找的例程包括:clock, delay, ftime, gettimeofday, msleep, nap, napms, nanosleep, setitimer, sleep, Sleep, times,而usleep。(虽然有一个名为wait的函数,但在 Unix 系统下,它至少不是您想要的。)selectpoll调用(如果可用)可以用于实现简单的延迟。在 MS-DOS 机器上,可以重新编程系统计时器和计时器中断。

其中,只有clock是 ANSI 标准的一部分。两次调用之间的区别是:clock给出经过的执行时间,如果 CLOCKS_PER_SEC 大于 1,甚至可能具有亚秒级精度。然而,clock给出当前程序使用的经过的处理器时间,在多任务系统(或非 CPU 密集型程序)上,这可能与实际时间有很大不同。

如果您试图实现延迟,而您唯一可用的只是一个时间报告函数,您可以实现一个 CPU 密集型的忙等待,但这仅适用于单用户、单任务机器,因为它对任何其他进程都非常不友好。在多任务操作系统下,请确保使用一个可以将您的进程休眠指定时间的调用,例如sleepselectpausealarmsetitimer.

结合使用。对于非常短暂的延迟,很容易使用一个不执行任何操作的循环,例如

	long int i;
	for(i = 0; i < 1000000; i++)
		;
但如果可能,请尽量避免这种诱惑!首先,您精心计算的延迟循环在下个月出现更快的处理器时将无法正常工作。更糟糕的是,一个聪明的编译器可能会注意到循环什么也没做,并将其完全优化掉。

附加链接:Pedro Zorzenon Neto 描述的涉及 I/O 指令的技术

参考文献:H&S 第 18.1 节,第 398-9 页
PCS 第 12 节,第 197-8、215-6 页
POSIX 第 4.5.2 节


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管