![](/img/trans.png)
[英]On windows 7, thread appears to be hung at _endthreadex and Waitforsingleobject with a timeout doesn't signal
[英]WaitForSingleObject doesn't timeout
以下簡單代碼無法正常運行。 它創建一個線程(掛起),啟動它,等待它運行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;
}
不能依靠WaitForSingleObject
的dwMilliseconds
參數來進行精確計時。 唯一的約定是,經過了這么長的時間后,線程最終將喚醒並返回TIMEOUT
值。 線程可能要等到下一個預定的時間間隔才能喚醒,該時間間隔可能高達60毫秒(在Windows Server上甚至更高)。 這對於第二個線程來說已經足夠了。 嘗試增加迭代計數,以使工作線程至少花費一秒鍾的時間運行-這對於安排主線程並運行至少TIMEOUT
循環的迭代應該是足夠的時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.