WaitForSingleObject不会超时

时间:2016-03-01 06:25:51

标签: c++ multithreading winapi

以下简单代码无法按预期运行。它创建一个线程(挂起),启动它,等待它运行1毫秒并循环等待线程死亡或失败。

我希望输出符合以下几点:

  

开始
  回调运行
  回调运行
  回调运行
  WaitForSingleObject循环
  回调运行
  回调运行
  WaitForSingleObject循环
  回调运行
  回调运行
  WaitForSingleObject循环
  回调运行
  回调运行
  ...重复10000次
  结束
  线程结束

但输出是:

  

开始
  回调运行
  回调运行
  回调运行
  回调运行
  回调运行
  ...重复10000次
  回调运行
  结束
  WaitForSingleObject循环
  线程结束

我认为WaitForSingleObject中的等待会在某个时刻超时并在某个时刻中断线程?但线程似乎是阻塞而不是异步?

DWORD WINAPI callback(LPVOID param)
{
    printf("Start\n");

    for (int i=10000; i>0; i--)
        printf("Callback running\n");

    printf("End\n");
    return 1;
}

int main()
{
    HANDLE hThread = CreateThread(NULL, 0, callback, 0, CREATE_SUSPENDED, 0);

    if (!hThread) {
        printf("Failed to create thread\n");
        return 0;
    }

    ResumeThread(hThread);
    while (WaitForSingleObject(hThread, 1) == WAIT_TIMEOUT) {
        printf("WaitForSingleObject looping\n");
    }

    CloseHandle(hThread);
    printf("Thread end\n");

    system("PAUSE");
    return 0;
}

1 个答案:

答案 0 :(得分:2)

dwMilliseconds中的WaitForSingleObject参数不能用于准确计时。唯一的合同是,经过那么多时间后,线程将最终唤醒并返回TIMEOUT值。线程可能无法唤醒,直到其下一个计划的量程,可能高达60毫秒(在Windows Server上甚至更高)。这足以让第二个线程完成。尝试增加迭代次数,使工作线程至少运行一秒 - 这应该是主线程被调度并且至少再运行一次TIMEOUT循环的时间。