当前位置: 首页 > 知识库问答 >
问题:

WaitForSingleObject不超时

穆锋
2023-03-14

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

我希望输出大致如下:

开始
回调运行
回调运行
回调运行
等待对于单个对象循环

调运行 回调运行
WaitForSingleObject 循环
回调运行
回调运行
WaitForSingleObject 循环
回调运行
回调运行
...重复 10000 次
结束
Thread结束

但输出是:

启动
回调运行
回叫运行
回叫运行
回叫运行
…重复10000次
回叫运行
结束
WaitForSingleObject循环
线程结束

我认为<code>WaitForSingleObject</code>中的等待会在某一点超时,并在某一时刻中断线程?但是线程似乎是阻塞的而不是异步的?

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个答案

汤飞
2023-03-14

不能依靠< code>WaitForSingleObject中的< code>dwMilliseconds参数来获得准确的计时。唯一的约定是,经过这么长时间后,线程最终会醒来并返回< code>TIMEOUT值。该线程可能直到其下一个预定的时间量才被唤醒,该时间量可能高达60毫秒(在Windows Server上甚至更高)。这对于第二个线程来说已经足够了。尝试增加迭代次数,使工作线程至少需要一秒钟来运行——这应该有足够的时间来调度主线程,并至少再运行一次< code>TIMEOUT循环的迭代。

 类似资料:
  • 问题内容: 我正在将应用程序从Windows迁移到Linux。我在和接口方面面临问题。 在我的应用程序中,我产生了多个线程,其中所有线程都等待父进程的事件或每t秒定期运行。 我已经检查了,但是我们必须为此指定绝对时间。 如何在Unix中实现呢? 问题答案: 坚持使用。例如: 如果需要,可以将其包装在函数中。 更新:根据我们的评论补充答案。 POSIX没有像Windows那样的单一API来等待事件/

  • 问题内容: 我写了一个小类来同步Linux(实际上是Android)和Windows的线程。 这是我的界面的Win32实现: 问题是我不确定POSIX等效什么。到目前为止,我已经基于这个SO问题写了下面的课,但是由于答案不完整,所以我不确定如何完成我的课: 问题答案: 您所描述的POSIX等效项是POSIX条件变量。请注意,条件变量必须始终与POSIX互斥锁配对使用,但是很多情况下,多个条件变量使

  • 我试图在我的spring boot应用程序中用jpa和db作为MySQL实现悲观锁。我的目标是让一个存储库首先从db获取一行,然后对其设置锁。当此事务运行时,任何人都不能读取同一行。以下是我实现的代码: 现在,当我运行它时,当第一个请求come with data>3时,这个提取行,然后锁定行,线程Hibernate90秒。现在,当第二个请求带有data=1时,线程等待锁(em.find-具有超时

  • 我想我已经阅读了关于堆栈溢出的所有Selenium超时问题,但是在我的Selenium webdriver 2.25(Python 2.7绑定)中,隐式超时和显式超时都不起作用,而且“no_timeout_here=”行都将永远挂起-- 所有指针将非常感谢! 10月16日更新 我可以知道您的OS/Python版本吗?

  • 使用Go编译运行代码会有很大概率出现以下错误: 但是多编译运行几次就又正常了,时不时的就会出现这种问题 环境版本信息: 希望每一次编译运行都能够正常

  • 我有一个springboot rest服务a使用RESTTemplate调用rest服务B。Rest服务A的restTemplate bean是按照下面的代码片段所示的超时设置创建的。