我想要的是一个简单的函数类型:
alive :: ThreadID -> IO Bool
据我所知,这在标准base
库中是不可能的,但您可以使用GHC特定的API来获取线程的状态:
import GHC.Conc
alive :: ThreadID -> IO Bool
alive = fmap (== ThreadRunning) . threadStatus
在dflemstr的答案上扩展了不同的定义,以说明线程何时被阻塞。我认为,一旦它被阻止的原因得到解决(例如,MVar
被写入,retry
上的STM
事务完成等),它很快就会再次执行代码,这也算是活动的:
import GHC.Conc
import Control.Monad
isThreadStatusBlocked :: ThreadStatus -> Bool
isThreadStatusBlocked (ThreadBlocked _) = True
isThreadStatusBlocked _ = False
isAlive :: ThreadId -> IO Bool
isAlive = fmap (liftM2 (||) (ThreadRunning ==) isThreadStatusBlocked) . threadStatus