WinAPI Sleep()函数调用睡眠时间超过预期

NFR*_*RCR 9 c++ windows winapi

操作系统:Windows 7

当将WinAPI Sleep()函数调用为Sleep(1)时,线程实际上会休眠15ms.我在循环中做了100次,总睡眠时间是1500毫秒而不是100毫秒.

这是常见的行为,还是我应该关注我的MOBO,CPU,Windows安装有什么问题?

编辑:如果可能的话,你可以运行这段代码并发布睡眠时间.我让我的一个朋友跑了这个,他实际上已经在1ms完成了所有这一切.

#include <iostream>
#include <ctime>
#include <Windows.h>

void test(void)
{
    std::cout << "Testing 1ms sleep." << std::endl;

    for (unsigned int i = 0; i < 10; i++)
    {
        std::clock_t startClocks = std::clock();

        Sleep(1);

        std::clock_t clocksTaken = std::clock() - startClocks;
        std::cout << "Time: " << clocksTaken << "ms." << std::endl;
    }
}

int main(void)
{
    test();

    std::cin.sync();
    std::cin.get();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑2:似乎有些人获得1毫秒的原因是其他一些程序正在运行,将系统范围的计时器分辨率设置为1毫秒.默认情况下,Windows 7上的此值应为15.6毫秒.

obm*_*arg 13

Sleep 可以导致线程休眠的时间超过指定的超时时间,它只能保证线程至少休眠那段时间.

文档:

休眠间隔过后,线程就可以运行了.如果指定0毫秒,则线程将放弃其时间片的剩余部分但仍保持准备状态.请注意,不保证立即运行就绪线程.因此,线程可能在睡眠间隔过去一段时间后才运行.有关更多信息,请参阅计划优先级.


Ric*_*ard 10

这是常见的行为吗?

它是.

Window的线程调度程序适用于时间量程(确切长度取决于各种因素,包括Windows版本和版本).实际上,任何非零延迟都会四舍五入到完整的量子.


das*_*esy 6

我发现的有关 Windows 计时的最佳文章位于此处此处。有用的部分是,一旦更改多媒体计时器分辨率(例如将timeBeginPeriod(1)更改为 1 毫秒),它也会影响睡眠命令,因为它通常会影响调度程序。也就是说,在非实时操作系统上实现 1 毫秒的精度是不可行的。