2010-11-13 42 views
4

我在C.WaitForSingleObject是否放棄線程的時間片?

製作Win32程序當你有多個線程運行,並且一個線程等待一個事件(使用WaitForSingleObject()例如),這是否線程仍然得到其完整的CPU時間片?

換言之,操作系統是否知道該線程不需要其時間片,直到其中一個事件發出信號爲止?

+0

是的,操作系統知道它。這就是線程調度的重點 - 只運行那些真正在做某些事情的線程。 「 – Dialecticus 2010-11-13 01:06:04

回答

8

是 - 線程被阻塞,直到等待的任何信號變成信號。線程不會計劃在阻塞時運行,因此其他線程將獲得所有CPU時間。

請注意,雖然時間片沒有進入。一個線程可以放棄在時間片中間的執行,並且(例如)如果它正在等待的內容快速變爲信號,它可能會在其原始時間片到期之前再次開始執行。當有信號發出時,正在等待的線程可以立即喚醒,而不必等待時間片結束(例如,如果正在等待的線程比正在運行的線程具有更高的優先級)。

+0

」是 - 線程被阻塞,直到等待的任何信號變成信號。「如果在調用WaitForSingleObject時已經發送了對象,線程是否放棄其時間片的剩餘部分? – traal 2015-02-27 18:40:26

+0

至少在我的測試中,如果一個對象在您調用WaitForSingleObject時已經發出信號,它就會返回並且線程繼續執行。它涉及切換到內核模式並返回,所以它可能需要幾微秒的時間。但是,不,只是調用WFSO/WFMO並不意味着線程正在產生其餘的時間片。 – 2015-02-27 21:13:41

2

如果您正在等待的對象尚未發出信號,則該線程將產生其餘時間片並進入休眠狀態,直到該對象發出信號。