Sleep()vs _sleep()函数

mle*_*lel 7 c c++ windows

目前,我正在开发一个用Visual Studio 2010或更低版本开发的Windows(C和C++)旧项目.我们想为Visual Studio 2015或2017等新版本更新它.

我发现Microsoft不再支持 _sleep()函数,而是我将使用Sleep()函数.

我没有找到旧的_sleep()函数的等效文档,我想知道两个函数是否完全相同?这篇MSDN帖子让我想知道唯一的区别在于参数的类型是什么?

提前感谢您的回答.

rus*_*tyx 6

正如 RbMm 所提到的,_sleep已经作为一个非常薄的包装器实现Sleep

void __cdecl _sleep(unsigned long dwDuration)
{

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

}
Run Code Online (Sandbox Code Playgroud)

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

#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";
}
Run Code Online (Sandbox Code Playgroud)

输出:

void __cdecl _sleep(unsigned long dwDuration)
{

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

}
Run Code Online (Sandbox Code Playgroud)

所以它同时出现_sleepSleep睡眠特定的毫秒数。
_sleep是一个 MSVC CRT 函数,Sleep是一个 Windows API。
所以在 MSVC 中,它们应该是可以互换的。

一个细微的区别是,在发生0争吵时,会_sleep睡觉,1msSleep根本不会睡觉。

  • @DavidA.Gray 当您指定睡眠时间时,这是最短时间。如果有利于系统性能,该平台可以让您休眠更长时间。因此,零(或更多)毫秒的睡眠告诉平台,现在是让您入睡的好时机,如果它有助于性能,但如果它对性能没有帮助,您可以继续做有用的工作。它通常是在最佳抢占点完成的,例如在释放一些锁之后(给其他线程有机会获得它)或在获取一些锁之前(以减少在持有它时被抢占的可能性)。 (2认同)