はタイプのシンプルな機能である:HaskellはforkIOの後にThreadIDを使ってスレッド状態を問い合わせる方法はありますか?私が探しています何
alive :: ThreadID -> IO Bool
はタイプのシンプルな機能である: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