首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WaitForSingleObject不超时

WaitForSingleObject不超时
EN

Stack Overflow用户
提问于 2016-03-01 06:25:51
回答 1查看 1.8K关注 0票数 1

下面的简单代码并不像我预期的那样运行。它创建一个线程(挂起),启动它,等待它运行1毫秒,循环等待线程死掉或失败。

我预期输出的内容大致如下:

开始 回调运行 回调运行 回调运行 WaitForSingleObject循环 回调运行 回调运行 WaitForSingleObject循环 回调运行 回调运行 WaitForSingleObject循环 回调运行 回调运行 ..。重复10000次 结束 螺纹端

但产出如下:

开始 回调运行 回调运行 回调运行 回调运行 回调运行 ..。重复10000次 回调运行 结束 WaitForSingleObject循环 螺纹端

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

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-01 06:40:39

不能依赖WaitForSingleObject中的WaitForSingleObject参数来精确计时。唯一的约定是,经过这么长时间之后,线程最终会醒来并返回TIMEOUT值。线程可能要到下一个预定的量程才会醒来,这可能高达60毫秒(在Windows上甚至更高)。这是足够的时间来完成第二个线程。尝试增加迭代次数,这样工作线程至少需要1秒才能运行--这应该是调度主线程的充足时间,并且至少再运行一次TIMEOUT循环的迭代。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35716060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档