Deadlock when using Control.Concurrent.Chan

Ben Franksen ben.franksen at online.de
Sat Feb 28 09:14:01 EST 2009


This code demonstrates the problem:

import Control.Concurrent
import Control.Concurrent.Chan
import Control.Monad

test = do
  c <- newChan
  forkIO $ forever $ do
    i <- readChan c
    print i
  writeChan c 1
  threadDelay 1000000
  isEmptyChan c >>= print

Test session:

ben at sarun[1]: .../hca/current > ghci Bug5.hs
GHCi, version 6.10.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main             ( Bug5.hs, interpreted )
Ok, modules loaded: Main.
*Main> test
1

The program hangs here. This is a deadlock caused by the calls to
isEmptyChan and readChan both waiting on the same MVar, as a quick look at
the sources reveals. I don't have an immediate fix but is shouldn't be too
hard to find one. I can try to, if it is consensus that this is a bug.

Incidentally, if I replace Chan with TChan (and wrap all xxxTChan calls in
an atomically), then this code terminates just fine.

Cheers
Ben



More information about the Libraries mailing list