2012-02-28 9 views

Respuesta

17

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 
1

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 
Cuestiones relacionadas