下面的简单代码并不像我预期的那样运行。它创建一个线程(挂起),启动它,等待它运行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;
}发布于 2016-03-01 06:40:39
不能依赖WaitForSingleObject中的WaitForSingleObject参数来精确计时。唯一的约定是,经过这么长时间之后,线程最终会醒来并返回TIMEOUT值。线程可能要到下一个预定的量程才会醒来,这可能高达60毫秒(在Windows上甚至更高)。这是足够的时间来完成第二个线程。尝试增加迭代次数,这样工作线程至少需要1秒才能运行--这应该是调度主线程的充足时间,并且至少再运行一次TIMEOUT循环的迭代。
https://stackoverflow.com/questions/35716060
复制相似问题