
Hello Facundo, The reason is that you have compiled the program to be multithreaded, but it is not running with multiple cores. Compile also with -rtsopts and then pass +RTS -N2 to the program. Excerpts from Facundo DomÃnguez's message of Sat Oct 19 15:19:22 -0700 2013:
Hello, Below is a program that seems to block indefinitely with ghc in a multicore machine. This program has a loop that does not produce allocations, and I understand that this may grab one of the cores. The question is, why can't the other cores take the blocked thread?
The program was compiled with:
$ ghc --make -O -threaded test.hs
and it is run with:
$ ./test
Program text follows.
Thanks, Facundo
--------
import Control.Concurrent import Control.Monad import System.Environment
main :: IO () main = do y <- getArgs mv0 <- newEmptyMVar mv1 <- newEmptyMVar forkIO $ do takeMVar mv0 putMVar mv1 () loop (y == ["yield"]) putMVar mv0 () takeMVar mv1
loop :: Bool -> IO () loop cooperative = go where go = when cooperative yield >> go