如何在 Windows 上使线程睡眠时间少于一毫秒

新手上路,请多包涵

在 Windows 上,我有一个在 Unix 上从未遇到过的问题。这就是如何让线程休眠不到一毫秒。在 Unix 上,您通常有多种选择(sleep、usleep 和 nanosleep)来满足您的需求。然而,在 Windows 上,只有毫秒粒度的 _睡眠_。

在 Unix 上,我可以使用 select 系统调用来创建微秒睡眠,这非常简单:

 int usleep(long usec)
{
    struct timeval tv;
    tv.tv_sec = usec/1000000L;
    tv.tv_usec = usec%1000000L;
    return select(0, 0, 0, 0, &tv);
}

我怎样才能在 Windows 上达到同样的效果?

原文由 Jorge Ferreira 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

在 Windows 上,使用 select 会强制您在应用程序中包含必须像这样初始化的 Winsock 库:

 WORD wVersionRequested = MAKEWORD(1,0);
WSADATA wsaData;
WSAStartup(wVersionRequested, &wsaData);

然后 select 不允许你在没有任何套接字的情况下被调用,所以你必须做更多的事情来创建一个 microsleep 方法:

 int usleep(long usec)
{
    struct timeval tv;
    fd_set dummy;
    SOCKET s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    FD_ZERO(&dummy);
    FD_SET(s, &dummy);
    tv.tv_sec = usec/1000000L;
    tv.tv_usec = usec%1000000L;
    return select(0, 0, 0, &dummy, &tv);
}

所有这些创建的 usleep 方法在成功时返回零,在错误时返回非零。

原文由 Jorge Ferreira 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果机器运行的是 Windows 10 版本 1803 或更高版本,那么您可以使用 CreateWaitableTimerExWCREATE_WAITABLE_TIMER_HIGH_RESOLUTION 标志。

原文由 sir-pinecone 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题