没有系统或IO调用的睡眠

时间:2014-03-18 10:40:29

标签: c++ sleep transactional-memory

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

This question建议实现嵌套循环以保持程序繁忙并将其延迟一段时间。但是,我希望能够使用优化来编译,这将删除这些循环。

一个想法可能是计算一些复杂的数学方程。有没有办法解决这个问题?等待的实际时间不一定是精确的 - 但是对于多次运行它应该模糊地相同。

3 个答案:

答案 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);
}

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

<强>更新

另一个选择是使用thisvolatile计数器等循环。

答案 2 :(得分:0)

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

但是如果你只是想要一个延迟循环,那么当时间不重要时,你应该寻找特定于平台的代码。例如,有一个名为_mm_pause的特定于英特尔的内部转换为CPU pause指令,它基本上会暂停管道,直到下一次内存总线同步通过。它被设计成一个自旋锁循环(旋转和重新查询原子变量没有任何意义,直到有可能出现新信息),但它可能(可能 - 阅读文档)禁止编译器从将延迟循环移除为空。