Есть ли способ в Haskell запросить состояние потока, используя ThreadID после forkIO?

То, что я ищу, - простая функция типа:

alive :: ThreadID -> IO Bool

Ответ 1

Это невозможно в стандартных библиотеках base, насколько я знаю, но вы можете использовать специфический API GHC для получения статуса потока:

import GHC.Conc

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

Ответ 2

Различные определения, распространяющиеся на ответ dflemstr, также учитываются при блокировке потока. Я думаю, что это также считается живым, так как довольно скоро он снова выполняет код, после чего позаботится о причине его блокировки (например, записывается MVar, транзакция STM на retry и т.д. ):

import GHC.Conc
import Control.Monad

isThreadStatusBlocked :: ThreadStatus -> Bool
isThreadStatusBlocked (ThreadBlocked _) = True
isThreadStatusBlocked _ = False

isAlive :: ThreadId -> IO Bool
isAlive = fmap (liftM2 (||) (ThreadRunning ==) isThreadStatusBlocked) . threadStatus