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