尝试在不使用nanosleep / usleep的情况下创建C函数的延迟

时间:2014-11-03 07:05:51

标签: c++ c

我正在尝试创建固定延迟,例如10ms,20ms等,但不想使用usleep功能,因为它允许CPU在那段时间内处理其他任务。我想实现阻塞延迟(CPU不应该在该延迟期间执行其他任务)。我想到的一种方法是运行空的'for'循环,但无法确定实现精确延迟所需的循环索引。有没有其他人知道任何其他更好的方法来实现这一目标?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

这实际上无法完成,因为操作系统将重新安排您的流程线程,即使它处于繁忙的循环中(无尽的for loop)。

所以你可以在你的线程中设置'10ms'的执行时间,但它不能保证它将是一个绝对的10ms的挂起时间。

此外,现代CPU根据需求,温度等改变频率......所以即使你最终需要10ms的for个循环周期,它在实际执行中也不会匹配10ms 准确

答案 1 :(得分:0)

在用户空间中,这可能无法作为OS的重新安排任务,进行负载平衡等,因此无法保证绝对延迟。我遇到过这样一个问题并使用了一种叫做“忙碌等待”的技术。或者“忙着循环”#39; (参考 - http://www.makelinux.net/books/lkd2/ch10lev1sec8)。如果延迟要求以毫秒或微秒为单位,则可以使用函数mdelayudelay,或使用jiffies来延迟更长时间。该链接应该可以帮助您准确实施。

优点 - 这种方法可以提供相当精确的延迟,并且还会使处理器在愚蠢的循环中旋转,就像您希望的那样。

Cons-这是一个内核空间实现,你必须努力编写一个虚拟驱动程序来调用这个函数。

快速建议 - 另请注意,除非需要,否则不建议繁忙循环,因为它只会浪费处理器时钟周期,更好的解决方案是重新安排线程/进程以允许处理器在代码等待时完成其他工作。 / p>