0

对于具有硬件事务内存的场景,我需要一个不会发出任何系统或 IO 调用的睡眠(这些调用将导致中止)。睡 1 微秒usleep(1)就好了。

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

一个想法可能是计算一些复杂的数学方程。有没有办法解决这个问题?实际等待的时间不必很精确——但是对于多次运行来说,它应该是大致相同的。

4

3 回答 3

1

尝试使用 volatile指令的nop循环:asm

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

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

于 2014-03-18T14:03:38.083 回答
0

这里棘手的部分是时机。查询任何类型的计时器都可能算作 I/O 功能,具体取决于操作系统。

但是,如果您只想要一个延迟循环,当时间不那么重要时,您应该查看特定于平台的代码。例如,有一个 Intel 特定的内部函数调用_mm_pause,它转换为 CPUpause指令,它基本上会暂停流水线,直到下一个内存总线同步通过。它被设计为放入自旋锁循环(在有可能获得新信息之前旋转和重新查询原子变量没有意义),但它可能(可能- 阅读文档)阻止编译器将延迟循环删除为空.

于 2014-03-18T11:17:44.587 回答
0

您可以使用以下代码:

#include <time.h>

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

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

更新

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

于 2014-03-18T11:10:20.043 回答