2012-11-18 32 views

回答

7

yield不暫停當前線程 - 它將其移動到運行隊列的後面。它仍然在運行隊列中,它只是確保其他可運行線程(如果定義了多個執行上下文,可能不是所有可運行線程,這使得這是一個非常弱的保證)有機會在繼續運行之前運行。大多數情況下,您應該忽略yield。例外是你明確瞭解它的作用,以及爲什麼這很重要。

要實際掛起並恢復一個線程,MVar s是要走的路。當線程在空的MVar上等待時,它將從可運行隊列中刪除。當一個值被放入MVar時,一個等待它的線程(我相信GHC總是等待MVar最長的線程,但不能保證)被放回到可運行隊列中。

+0

嗯......聽起來不錯。 – fho