以下简单代码无法按预期运行。它创建一个线程(挂起),启动它,等待它运行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;
}
答案 0 :(得分:2)
dwMilliseconds
中的WaitForSingleObject
参数不能用于准确计时。唯一的合同是,经过那么多时间后,线程将最终唤醒并返回TIMEOUT
值。线程可能无法唤醒,直到其下一个计划的量程,可能高达60毫秒(在Windows Server上甚至更高)。这足以让第二个线程完成。尝试增加迭代次数,使工作线程至少运行一秒 - 这应该是主线程被调度并且至少再运行一次TIMEOUT
循环的时间。