【发布时间】:2012-02-28 02:07:37
【问题描述】:
我正在寻找的是一个简单的类型函数:
alive :: ThreadID -> IO Bool
【问题讨论】:
标签: multithreading haskell concurrency ghc
我正在寻找的是一个简单的类型函数:
alive :: ThreadID -> IO Bool
【问题讨论】:
标签: multithreading haskell concurrency ghc
据我所知,这在标准 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
【讨论】: