Lo que estoy buscando es una función simple de tipo:¿Hay alguna manera en Haskell de consultar el estado del hilo usando ThreadID después de un forkIO?
alive :: ThreadID -> IO Bool
Lo que estoy buscando es una función simple de tipo:¿Hay alguna manera en Haskell de consultar el estado del hilo usando ThreadID después de un forkIO?
alive :: ThreadID -> IO Bool
Esto no es posible con los base
bibliotecas estándar por lo que yo sé, pero se puede utilizar la API específica GHC para obtener el estado de un hilo:
import GHC.Conc
alive :: ThreadID -> IO Bool
alive = fmap (== ThreadRunning) . threadStatus
Diferente definición que se extiende en la respuesta de dflemstr para también tener en cuenta cuando el hilo está bloqueado. Creo que también cuenta como la vida, como muy pronto se ejecute código de nuevo, una vez que la razón de por qué está bloqueado está cuidado (por ejemplo, un MVar
se escribe, una transacción STM
en retry
ultima, etc.):
import GHC.Conc
import Control.Monad
isThreadStatusBlocked :: ThreadStatus -> Bool
isThreadStatusBlocked (ThreadBlocked _) = True
isThreadStatusBlocked _ = False
isAlive :: ThreadId -> IO Bool
isAlive = fmap (liftM2 (||) (ThreadRunning ==) isThreadStatusBlocked) . threadStatus