C++:如何让程序休眠一纳秒?

8

可能是重复的问题:
如何让程序休眠一纳秒?

我该如何让程序休眠一纳秒?我在互联网上搜索到了几种方式可供使用:

  • Sleep()函数只能让程序休眠毫秒级别的时间。
  • nanosleep()函数只适用于POSIX系统,而我使用的是Windows。
  • 我也尝试过下面这个方法:
int usleep(long usec)
{
    struct timeval tv;
    tv.tv_sec = usec/1000000L;
    tv.tv_usec = usec%1000000L;
    return select(0, 0, 0, 0, &tv);
};

但是Code::Blocks表示:
obj\Release\main.o:main.cpp|| undefined reference to `select@20'|

我尝试了很多方法,但都失败了。我该怎么办?


5
你为什么想要睡这么短的时间?你觉得这对你有意义吗?(考虑到缓存故障、上下文切换和其他无法重现的导致延迟超过纳秒的原因...) - Basile Starynkevitch
1
执行单个CPU指令所需的时间大约为纳秒级别。您可能需要专用硬件才能实现所需的定时。 - Emile Cormier
我目前正在尝试在进入循环时减少CPU周期。Sleep对此来说太慢了,因此我正在寻找更快的替代方案。 - SmRndGuy
你可以考虑忙等待的替代方案 - Sam Miller
将-lWSock32添加到链接Winsock。 - Hassen Dhia
显示剩余2条评论
2个回答

17

使用C++11

#include <chrono>
#include <thread>
...
std::this_thread::sleep_for(std::chrono::nanoseconds(1));

请注意,实现可能会休眠比给定的时间段更长的时间。


1
在Windows上,sleep_for函数的分辨率不稳定。例如,在同一台机器上,最小的睡眠时间可能介于2微秒到2毫秒之间。如果你要求1毫秒的睡眠,很可能会看到它睡眠3毫秒等等。 - Shital Shah
2
@ShitalShah,你有相关的参考资料吗?这是一个标准问题还是实现问题? - Stephan Dollberg
这是旧的内容,但我在处理使用std::chrono的某些内容时遇到了它。sleep_for绝对不是非常准确的,而且似乎随着睡眠时间的增加而变得更糟。您可以自行验证。以下是我在MSVC 14下测试的结果。 目标:1000 实际:3800 目标:1000000 实际:1066700 目标:16000000 实际:16671100 所有值都以纳秒为单位。“目标”是传递给sleep_for的时间,“实际”是经过的实际时间。 - Underdisc

4
你还应该注意到调度器,它可能不允许睡眠时间短于一个时间片(大约在4毫秒 - 10毫秒左右,具体取决于你的Windows和机器)。在Windows上无法睡眠少于这个时间长度。这里有一些关于这个问题的(相当久远的)研究。本文建议使用Win32 timeBeginPeriod() 来实现。

此外,正确的术语是“量子”(而不是时间片),它是Windows调度程序为线程分配运行时间的量。此外,内核的量子设置并不一定意味着最小的休眠时间,调度程序可能会在不到一个量子的时间内挂起和恢复一个线程(量子不用于强制执行线程空闲时间,而是用于限制线程运行时间)。 - Shaun Wilson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接