【问题标题】:Sleep() vs _sleep() functionsSleep() 与 _sleep() 函数
【发布时间】:2018-08-30 19:49:09
【问题描述】:

目前,我正在开发一个使用 Visual Studio 2010 或更低版本为 Windows 开发的旧项目(使用 C 和 C++)。我们希望将其更新为较新的版本,例如 Visual Studio 2015 或 2017。

我发现_sleep() 函数是no longer supported by Microsoft,而我将使用Sleep() 函数。

我没有为旧的_sleep() 函数找到等效的documentation,我想知道这两个函数的行为是否完全相同?这个MSDN post 让我想知道唯一的区别是否在于参数的类型?

提前感谢您的回答。

【问题讨论】:

  • 如果你想现代化你的代码,你可以看看std::this_thread::sleep_for
  • 正如文档所述。切换到Sleep 应该是从_sleep 的无缝过渡
  • 感谢sleep_for 功能。我们对 C 项目也有同样的问题(我也会添加 C 标签)。
  • sleep() 是一个posix 函数,曾经被Windows NT 和微软的C 编译器支持。在 posix 子系统停止使用后,它获得了一个前导下划线,全局命名空间中有太多短小写标识符。只要您考虑 posix 函数,您不妨考虑 Windows 函数 :)
  • @HansPassant - Windows 从未完全支持 POSIX。你如何解释 sleep() 接受秒和 _sleep() 毫秒。

标签: c++ c windows winapi


【解决方案1】:

正如 RbMm 所提到的,_sleep 一直是 implemented 作为 Sleep 的非常薄的包装:

void __cdecl _sleep(unsigned long dwDuration)
{

    if (dwDuration == 0) {
        dwDuration++;
    }
    Sleep(dwDuration);

}

为了确认,我们可以测试一下。幸运的是,它很容易测试:

#include <iostream>
#include <chrono>
#include <windows.h>
#include <stdlib.h>

using namespace std::chrono_literals;

int main() {
    auto tm1 = std::chrono::system_clock::now();
    _sleep(250);
    auto tm2 = std::chrono::system_clock::now();
    Sleep(250);
    auto tm3 = std::chrono::system_clock::now();
    std::cout << "_sleep took " << (tm2-tm1)/1ms << " ms, Sleep took " << (tm3-tm2)/1ms << " ms\n";
}

输出:

_sleep took 250 ms, Sleep took 250 ms

因此,_sleepSleep 都在特定的毫秒数内休眠。
_sleep 是 MSVC CRT 函数,Sleep 是 Windows API。
所以在 MSVC 中它们应该是可以互换的。

一个小的区别是,在 0 参数的情况下,_sleep1ms 休眠,而 Sleep 根本不休眠。

【讨论】:

  • 只需寻找slbeep.c - 这里是_sleep 实现。不需要任何测试
  • 我认为这是一种改进。为什么你会想睡零毫秒。
  • @DavidA.Gray 当您指定睡眠时间时,它是最小值。如果这有利于系统性能,该平台可以让您睡得更久。因此,零(或更多)毫秒的睡眠告诉平台,如果它有助于提高性能,那么现在是让你进入睡眠的好时机,但如果它无助于提高性能,你可以继续做有用的工作。它通常在最佳抢占点完成,例如在释放一些锁之后(给其他线程一个机会)或在获得一些锁之前(以减少你在持有它时被抢占的可能性)。跨度>
  • 这在多核处理器出现之前特别有用。 Sleep(0) 是将您对 CPU 内核的控制权交还给操作系统的有效方法。
【解决方案2】:

我设法让 C 中的 Sleep() 函数在 Windows 10/21H2 上的 Visual Studio 2022 上运行。不得不添加通用 Windows 平台开发工作负载模块,并且还添加了 Win10 SDK。不确定单独的 SDK 是否可以做到这一点,这是首先要尝试的。您可以通过在 C 代码中添加 &lt;#windows.h&gt; 来调用 Sleep()

【讨论】:

  • 这个答案甚至没有解决所提出的问题。问题是询问旧的/已弃用的_sleepSleep 之间的区别,而不是如何在项目中使用Sleep。此外,Sleep 是一个 Win32 API 函数,可以包含在 #include &lt;synchapi.h&gt; 中——您不需要更重的 &lt;windows.h&gt; 标头或 UWP SDK。
  • 另外,Sleep 已经存在很长时间了,它并不是一个新功能。
  • 这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review
  • 哎呀,你是对的。我是倒着读的。 _sleep() 函数:我认为我没有工作,因为它可能已经消失/不受支持,但至于 Sleep() 肯定这仍然有效。我最初在让 与 Sleep() 一起工作时遇到了问题,但在我添加了 SDK 之后,它似乎工作了。对较新的 Visual Studio 应用程序非常陌生,为新的答案道歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
  • 2011-05-17
  • 2016-07-13
相关资源
最近更新 更多