
Hi Olaf,
`forkIO` is rather a low level. It's more common to use async package (https://hackage.haskell.org/package/async). Async has `waitCatch` which allows you to wait for a thread to finish and get access to either an exception which killed the thread or the result of the thread handler.
Best regards,
Marcin Szamotulski
Sent with ProtonMail secure email.
------- Original Message -------
On Monday, March 7th, 2022 at 10:56, Olaf Klinke
Dear Cafe,
I had expected to see ThreadDied in the small example below.
But when I compile with
ghc --make -threaded -with-rtsopts=-N2
The output is:
threadStatus: user error (child thread is crashing!)
The status of my child is:
ThreadFinished
The output is not really a lie. But how do I determine whether a child
thread has exited normally or not? Wouldn't you say a call to fail (or
any other throwIO) should count as ThreadDied?
The documentation of GHC.Conc.forkIO says:
"... passes all other exceptions to the uncaught exception handler."
and the documentation for GHC.Conc.ThreadStatus says:
ThreadDied -- the thread received an uncaught exception
One can provoke ThreadDied by using throwTo from the parent thread. So
the emphasis in the documentation of ThreadDied should be on the word
"received".
This is a case of misleading documentation, in my humble opinion.
The constructor should not be named ThreadDied because that suggests
inclusion of internal reasons.
Olaf
-- begin threadStatus.hs
import Control.Concurrent
import GHC.Conc
main = mainThread
childThread :: IO ()
childThread = fail "child thread is crashing!"
mainThread :: IO ()
mainThread = do
child <- forkIO childThread
threadDelay 5000
status <- threadStatus child
putStr "The status of my child is: "
print status
-- end threadStatus.hs
_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Only members subscribed via the mailman list are allowed to post.