对于具有硬件事务内存的场景,我需要一个不会发出任何系统或 IO 调用的睡眠(这些调用将导致中止)。睡 1 微秒usleep(1)
就好了。
这个问题建议实现嵌套循环以保持程序繁忙并延迟一段时间。但是,我希望能够通过删除这些循环的优化进行编译。
一个想法可能是计算一些复杂的数学方程。有没有办法解决这个问题?实际等待的时间不必很精确——但是对于多次运行来说,它应该是大致相同的。
对于具有硬件事务内存的场景,我需要一个不会发出任何系统或 IO 调用的睡眠(这些调用将导致中止)。睡 1 微秒usleep(1)
就好了。
这个问题建议实现嵌套循环以保持程序繁忙并延迟一段时间。但是,我希望能够通过删除这些循环的优化进行编译。
一个想法可能是计算一些复杂的数学方程。有没有办法解决这个问题?实际等待的时间不必很精确——但是对于多次运行来说,它应该是大致相同的。
尝试使用 volatile指令的nop
循环:asm
for (int i = 0; i < 1000; i++) {
asm volatile ("nop");
}
volatile 应该防止优化器摆脱它。如果那不这样做,然后尝试__volatile__
。
这里棘手的部分是时机。查询任何类型的计时器都可能算作 I/O 功能,具体取决于操作系统。
但是,如果您只想要一个延迟循环,当时间不那么重要时,您应该查看特定于平台的代码。例如,有一个 Intel 特定的内部函数调用_mm_pause
,它转换为 CPUpause
指令,它基本上会暂停流水线,直到下一个内存总线同步通过。它被设计为放入自旋锁循环(在有可能获得新信息之前旋转和重新查询原子变量没有意义),但它可能(可能- 阅读文档)阻止编译器将延迟循环删除为空.
您可以使用以下代码:
#include <time.h>
void delay(int n)
{
n *= CLOCKS_PER_SEC / 1000;
clock_t t1 = clock();
while (clock() <= t1 + n && clock() >= t1);
}
有时(不经常)由于时钟计数器溢出,此函数会导致比指定的延迟更少。
更新
另一种选择是将这样的循环与volatile
计数器一起使用。