Есть ли способ в Haskell запрашивать состояние потока, используя ThreadID после forkIO? - PullRequest
10 голосов
/ 28 февраля 2012

Я ищу простую функцию типа:

alive :: ThreadID -> IO Bool

Ответы [ 2 ]

17 голосов
/ 28 февраля 2012

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

import GHC.Conc

alive :: ThreadID -> IO Bool
alive = fmap (== ThreadRunning) . threadStatus
1 голос
/ 23 сентября 2016

Другое определение, распространяющееся на ответ 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
...