Другое определение, распространяющееся на ответ dflemstr, также учитывает, когда поток заблокирован. Я думаю, что он также считается живым, так как довольно скоро он снова выполняет код, как только выясняется причина его блокировки (например, записывается MVar
, транзакция STM
на retry
завершается и т. Д.). ):
import GHC.Conc
import Control.Monad
isThreadStatusBlocked :: ThreadStatus -> Bool
isThreadStatusBlocked (ThreadBlocked _) = True
isThreadStatusBlocked _ = False
isAlive :: ThreadId -> IO Bool
isAlive = fmap (liftM2 (||) (ThreadRunning ==) isThreadStatusBlocked) . threadStatus