Haskell中有没有一种方法可以在forkIO之后使用ThreadID查询线程状态



我想要的是一个简单的函数类型:

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

相关内容

最新更新