2012-02-28 4 views

答えて

17

これは私の知る限りでは、標準baseライブラリでは不可能ですが、スレッドの状態を取得するためにGHC特定のAPIを使用することができます。

import GHC.Conc 

alive :: ThreadID -> IO Bool 
alive = fmap (== ThreadRunning) . threadStatus 
1

異なる定義が、スレッドがブロックされたときの理由も考慮して、dflemstrの回答を拡張します。それがブロックされている理由の理由が世話をされると、私は(例えばMVarretry完了などに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 
関連する問題