關於中間件源碼中的線程休眠 Thread.Sleep(0) vs Thread.Sleep(1)

Thread.Sleep(0)

Sleep 的意思是告訴操作系統自己要休息 n 毫秒,這段時間就讓給另一個就緒的線程吧。當 n=0 的時候,意思是要放棄自己剩下的時間片,但是仍然是就緒狀態,其實意思和 Yield 有點類似。但是 Sleep(0) 只允許那些優先級相等或更高的線程使用當前的CPU,其它線程只能等着捱餓了。如果沒有合適的線程,那當前線程會重新使用 CPU 時間片。
If you specify 0 milliseconds, the thread will relinquish the remainder of its time slice but remain ready.
— Sleep Function

  • 優勢:相比 Yield,可以調度任何處理器的線程使用時間片。
  • 劣勢:只能調度優先級相等或更高的線程,意味着優先級低的線程很難獲得時間片,很可能永遠都調用不到。當沒有符合條件的線程,會一直佔用 CPU 時間片,造成 CPU 100%佔用率。

Thread.Sleep(1)

該方法使用 1 作爲參數,這會強制當前線程放棄剩下的時間片,並休息 1 毫秒(因爲不是實時操作系統,時間無法保證精確,一般可能會滯後幾毫秒或一個時間片)。但因此的好處是,所有其它就緒狀態的線程都有機會競爭時間片,而不用在乎優先級。

  • 優勢:可以調度任何處理器的線程使用時間片。無論有沒有符合的線程,都會放棄 CPU 時間,因此 CPU 佔用率較低。
  • 劣勢:相比 Thread.Sleep(0),因爲至少會休息一定時間,所以速度要更慢。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章