Ответ 1
Это невозможно в стандартных библиотеках base
, насколько я знаю, но вы можете использовать специфический API GHC для получения статуса потока:
import GHC.Conc
alive :: ThreadID -> IO Bool
alive = fmap (== ThreadRunning) . threadStatus
То, что я ищу, - простая функция типа:
alive :: ThreadID -> IO Bool
Это невозможно в стандартных библиотеках base
, насколько я знаю, но вы можете использовать специфический API GHC для получения статуса потока:
import GHC.Conc
alive :: ThreadID -> IO Bool
alive = fmap (== ThreadRunning) . threadStatus
Различные определения, распространяющиеся на ответ 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