2013-11-04 24 views
0

我想這是線程,說A,定時器創建。但我不知道如何調用回調函數。假定計時器到期,然後會發生什麼?當這個線程獲得時間片時會發生嗎?如果是這樣的話,我認爲這個函數應該被調度器調用,或者在上下文最終被切換到A之前被調用,那麼我可以說A是調用者嗎?誰是由CreateTimerQueueTimer()設置的回調函數的調用線程?

謝謝。

+0

在MSDN上查找API。 –

+0

嗨馬丁。我已經看過msdn上的功能。但事實上,我想知道操作系統如何實現這種功能。 – babel92

回答

1

定時器回調也可以由池線程調用,該線程專門管理定時器或在創建線程的上下文中(創建線程旨在接受和處理「異步過程調用」)。 CTQT()中的標誌參數控制定時器到期時的動作。

如果定時器事件被池線程或定時器管理器線程調用,該線程將在到期時變爲就緒狀態,並且當有可用的內核運行它時,它將在其內部立即進行回調上下文。創建定時器的線程可以(如果需要的話)等待一個同步對象(事件或信號量),這個同步對象可以由定時器回調(即正常的線程間通信)發送信號。

定時器回調只能在創建它的線程的上下文中執行,如果該線程在接收某種信號時處於執行回調的位置。在這些定時器的情況下,一個APC被QUEUED給創建線程,並且如果該線程在其中一個「可警告」等待調用上被阻塞,它將立即準備就緒,將在有可用的核心運行時運行。 APC運行後,等待電話將返回。如果等待呼叫不是SleepEx(),它將返回WAIT_IO_COMPLETION - 通常會被忽略的結果。如果線程在APC排隊時沒有等待,它將不會被執行,直到線程進行下一次等待調用(顯然 - 因爲線程必須關閉其他功能:)。 '如果是這種情況,我認爲函數應該由調度器調用,或者在上下文最終切換到A之前,然後我可以說A是調用者嗎?'沒有!

+0

非常有啓發性,可能需要一些時間才能完全理解。非常感謝Martin! – babel92