Is it true that an exception is always terminates the thread?
Edward Z. Yang
ezyang at MIT.EDU
Mon Jan 23 22:26:38 CET 2012
Excerpts from Heka Treep's message of Mon Jan 23 16:20:51 -0500 2012:
> actor :: TChan String -> IO ()
> actor mbox = forever $ do
> putStrLn "call to actor..."
> msg <- atomically $ do
> isEmpty <- isEmptyTChan mbox
> if isEmpty then return Nothing else readTChan mbox >>= return . Just
> when (isJust msg) $ putStrLn $ fromJust msg
There are several things wrong with this:
- You're only synchronizing over one variable: use an Chan, not a TChan
(if you make that change, btw, it will automatically start working.)
- You don't want the transaction to succeed in all cases; you only want
the transaction to succeed if you manage to get something from the
TChan. What you've done is convert the interface from blocking
to non-blocking, but in a busy-loop.
- You don't even need to run isEmptyTChan. Just do a readTChan. It will
block if there is nothing in the chan (technically, it will ask the
STM transaction to retry, but STM is clever enough not to try running
again unless any of the touched STM variables changes.)
More information about the Glasgow-haskell-users