C语言 Windows睡眠功能在给定时间之前唤醒



我有一个简单的代码运行在我的64位机器上,Windows 7作为一个标准的Windows应用程序:

    do {
        DWORD getCurrentTick = GetTickCount();;
        Sleep(20);
        DWORD nextTick = GetTickCount();
        printf("Tick = %dn", nextTick - getCurrentTick);
    } while(TRUE);

我知道用户模式线程睡眠不能保证在请求时间唤醒,但奇怪的是windows在时间到来之前唤醒。看看我的输出:

Tick = 15
Tick = 16
Tick = 16
Tick = 31
Tick = 15
Tick = 16
Tick = 15
Tick = 16
Tick = 31

我的问题是为什么它在我要求的时间之前醒来?我怎么做才能让它更精确呢?

操作系统有一个特定的线程调度量,这会影响线程等待的准确性。它的默认值是15毫秒,所以20的Sleep会在它之前或之后结束。这是"by design"。

在Win32桌面应用程序中可以通过使用旧的WinMM函数timeBeginPeriod(1)来提高精度;但这(a)是一个全局设置,(b)大大降低了电源管理的效率。

您应该使用可等待定时器事件而不是Sleep,但是当线程停止时,您仍将受到线程调度量子的准确性的影响。

最新更新