没有系统或IO调用的睡眠



我需要一个不发出任何系统或IO调用的睡眠(这些调用将导致中止)。像usleep(1)那样睡1微秒就可以了。

这个问题建议实现嵌套循环,使程序保持忙碌并延迟一段时间。但是,我希望能够通过优化编译来删除这些循环。

一个想法可以是计算一些复杂的数学方程。有办法吗?实际等待的时间不必是精确的-但是,对于多次运行,它应该大致相同。

尝试使用易失性asm指令进行nop循环:

for (int i = 0; i < 1000; i++) { 
    asm volatile ("nop"); 
} 

volatile应该防止优化器删除它。如果不这样做,然后尝试__volatile__

这里棘手的部分是时机。根据操作系统的不同,查询任何类型的计时器都可以算作I/O函数。

但是如果你只是想要一个延迟循环,当时间不是那么重要的时候,你应该看看特定于平台的代码。例如,有一个称为_mm_pause的英特尔特定内在指令,它转换为CPU的pause指令,它基本上停止管道,直到下一个内存总线同步完成。它被设计成放入自旋锁循环(在可能有新信息之前,旋转和请求原子变量没有意义),但是它可能(可能—阅读文档)阻止编译器将延迟循环作为空来删除。

您可以使用以下代码:

#include <time.h>
void delay(int n)
{
    n *= CLOCKS_PER_SEC / 1000;
    clock_t t1 = clock();
    while (clock() <= t1 + n && clock() >= t1);
}

有时(不经常),由于时钟计数器溢出,此函数将导致比指定的更小的延迟。

另一种选择是对volatile计数器使用这样的循环。

最新更新