【问题标题】:Is there a way in Haskell to query thread state using ThreadID after a forkIO?Haskell 有没有办法在 forkIO 之后使用 ThreadID 查询线程状态?
【发布时间】:2012-02-28 02:07:37
【问题描述】:

我正在寻找的是一个简单的类型函数:

alive :: ThreadID -> IO Bool

【问题讨论】:

    标签: multithreading haskell concurrency ghc


    【解决方案1】:

    据我所知,这在标准 base 库中是不可能的,但您可以使用 GHC 特定的 API 来获取线程的状态:

    import GHC.Conc
    
    alive :: ThreadID -> IO Bool
    alive = fmap (== ThreadRunning) . threadStatus
    

    【讨论】:

      【解决方案2】:

      在 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
      

      【讨论】:

        猜你喜欢
        • 2015-11-09
        • 1970-01-01
        • 2017-06-14
        • 1970-01-01
        • 1970-01-01
        • 2020-04-13
        • 1970-01-01
        • 1970-01-01
        • 2017-12-15
        相关资源
        最近更新 更多