gpt4 book ai didi

c++ - WaitForSingleObject 不会超时

转载 作者:行者123 更新时间:2023-11-30 03:44:03 26 4
gpt4 key购买 nike

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

我希望输出是这样的:

Start
Callback running
Callback running
Callback running
WaitForSingleObject looping
Callback running
Callback running
WaitForSingleObject looping
Callback running
Callback running
WaitForSingleObject looping
Callback running
Callback running
... repeating for 10000 times
End
Thread end

但是输出是:

Start
Callback running
Callback running
Callback running
Callback running
Callback running
... repeating for 10000 times
Callback running
End
WaitForSingleObject looping
Thread end

我以为 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;
}

最佳答案

WaitForSingleObject 中的dwMilliseconds 参数不能依赖于准确计时。唯一的约定是,经过那么多时间后,线程将最终 唤醒并返回TIMEOUT 值。线程可能要等到它的下一个计划量程才会唤醒,该量程可能高达 60 毫秒(在 Windows Server 上甚至更高)。这足以让第二个线程完成。尝试增加迭代计数,使工作线程至少需要一秒钟的时间来运行 - 这应该有足够的时间来安排主线程并至少再运行一次 TIMEOUT 循环的迭代。

关于c++ - WaitForSingleObject 不会超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35716060/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com