簡體   English   中英

WaitForSingleObject不超時

[英]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;
}

不能依靠WaitForSingleObjectdwMilliseconds參數來進行精確計時。 唯一的約定是,經過了這么長的時間后,線程最終將喚醒並返回TIMEOUT值。 線程可能要等到下一個預定的時間間隔才能喚醒,該時間間隔可能高達60毫秒(在Windows Server上甚至更高)。 這對於第二個線程來說已經足夠了。 嘗試增加迭代計數,以使工作線程至少花費一秒鍾的時間運行-這對於安排主線程並運行至少TIMEOUT循環的迭代應該是足夠的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM