sleep 的意思是告訴作業系統自己要休息 n 毫秒,這段時間就讓給另乙個就緒的執行緒吧。當 n=0 的時候,意思是要放棄自己剩下的時間片,但是仍然是就緒狀態,其實意思和 yield 有點類似。但是 sleep(0) 只允許那些優先順序相等或更高的執行緒使用當前的cpu,其它執行緒只能等著挨餓了。如果沒有合適的執行緒,那當前執行緒會重新使用 cpu 時間片
優勢:相比 yield,可以排程任何處理器的執行緒使用時間片。
劣勢:只能排程優先順序相等或更高的執行緒,意味著優先順序低的執行緒很難獲得時間片,很可能永遠都呼叫不到。當沒有符合條件的執行緒,會一直占用 cpu 時間片,造成 cpu 100%佔用率。
yield 的中文翻譯為 「放棄」,這裡意思是主動放棄當前執行緒的時間片,並讓作業系統排程其它就緒態的執行緒使用乙個時間片。但是如果呼叫 yield,只是把當前執行緒放入到就緒佇列中,而不是阻塞佇列。如果沒有找到其它就緒態的執行緒,則當前執行緒繼續執行。
優勢:比 thread.sleep(0) 速度要快,可以讓低於當前優先順序的執行緒得以執行。可以通過返回值判斷是否成功排程了其它執行緒。
劣勢:只能排程同乙個處理器的執行緒,不能排程其它處理器的執行緒。當沒有其它就緒的執行緒,會一直占用 cpu 時間片,造成 cpu 100%佔用率。
該方法使用 1 作為引數,這會強制當前執行緒放棄剩下的時間片,並休息 1 毫秒(因為不是實時作業系統,時間無法保證精確,一般可能會滯後幾毫秒或乙個時間片)。但因此的好處是,所有其它就緒狀態的執行緒都有機會競爭時間片,而不用在乎優先順序。
優勢:可以排程任何處理器的執行緒使用時間片。無論有沒有符合的執行緒,都會放棄 cpu 時間,因此 cpu 佔用率較低。
劣勢:相比 thread.sleep(0),因為至少會休息一定時間,所以速度要更慢
併發系列之 sleep 0
作業系統前置知識 在講兩者的區別前,先回顧一下作業系統的知識。作業系統中,cpu競爭有很多種策略 在時間片演算法中,所有的程序排成乙個佇列。作業系統按照他們的順序,給每個程序分配一段時間,即該程序允許執行的時間。如果在時間片結束時程序還在執行,則cpu將被剝奪並分配給另乙個程序。如果程序在時間片結束...
深入分析Sleep 0 與Sleep 1 的區別
深入分析sleep 0 與sleep 1 的區別 羅朝輝 目的 有時候我們想讓執行緒不被排程一定的時間,也就是說讓執行緒睡眠一段時間。api 介面 在 win32中可以呼叫 sleep,sleepex 和 switchtothread 三個api。void winapi sleep dword dw...
深入分析Sleep 0 與Sleep 1 的區別
深入分析sleep 0 與sleep 1 的區別 羅朝輝 目的 有時候我們想讓執行緒不被排程一定的時間,也就是說讓執行緒睡眠一段時間。api 介面 在 win32中可以呼叫 sleep,sleepex 和 switchtothread 三個api。void winapi sleep dword dw...