C++ 无需系统或IO调用即可睡眠

C++ 无需系统或IO调用即可睡眠,c++,sleep,transactional-memory,C++,Sleep,Transactional Memory,我需要一个不发出任何系统或IO调用的睡眠,用于具有硬件事务性内存的场景(这些调用将导致中止)。睡上1微秒,就像睡在usleep(1)中一样 建议实现嵌套循环以保持程序繁忙并将其延迟一段时间。但是,我希望能够通过优化来编译,这样可以删除这些循环 一个想法可能是计算一些复杂的数学方程。有没有办法做到这一点?实际等待的时间不一定要精确,但对于多次运行,实际等待的时间应该大致相同。您可以使用以下代码: #include <time.h> void delay(int n) { n

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

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

一个想法可能是计算一些复杂的数学方程。有没有办法做到这一点?实际等待的时间不一定要精确,但对于多次运行,实际等待的时间应该大致相同。

您可以使用以下代码:

#include <time.h>

void delay(int n)
{
    n *= CLOCKS_PER_SEC / 1000;
    clock_t t1 = clock();
    while (clock() <= t1 + n && clock() >= t1);
}
#包括
无效延迟(整数n)
{
n*=每秒时钟数/1000;
时钟t1=时钟();
while(clock()=t1);
}
有时(不经常)由于时钟计数器溢出,此函数会导致比指定的延迟更小的延迟

更新


另一种选择是使用类似于
volatile
计数器的循环。

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


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

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

for (int i = 0; i < 1000; i++) { 
    asm volatile ("nop"); 
} 
for(inti=0;i<1000;i++){
asm挥发性(“nop”);
} 

volatile应该可以防止优化器删除它。如果这还不行,那就试试。

花在醒着的时间(比如计算循环次数或执行冗长的等式)不是在睡觉。我在这里假设你是在英特尔的TSX上?另外,我对你的用例很好奇:延长事务生存期通常是个坏主意,因为这将不必要地增加冲突的可能性——除非这是重点?@MatthewG:是的,这是Intel的TSX(具体使用HLE)。您是对的,冲突的概率增加是比较两种算法在不同事务运行时的重点。好吧,看看结果会很有趣。最美好的祝福!不幸的是,
clock()
是一个系统调用。唉,这行不通。在TSX文档中,暂停被列为在任何TSX实现中无条件中止事务的指令之一。这起作用,不会导致中止-谢谢!(对于
usleep(1)
:在我的系统上1000个循环~1微秒)太棒了。很高兴听到这个消息。