Hello,

            I am playing around with concurrency using ghc 5.02.2.  What I’d like to do is have a bunch of threads do something indefinitely, while one thread monitors stdin for user input (the user input affects the behavior of the other threads in some way).  From the documentation I had assumed that standard Haskell I/O functions (like getline) would not block other running threads, but this doesn’t seem to be the case as illustrated here:

 

conTry3 = forkIO (loop 'a') >> quitYet

          where

            loop ch = hPutChar stdout ch >> loop ch

            quitYet = do

                x <- getLine

                if x == "quit" then return ()

                               else quitYet

 

Output: (stuff in between {} is a comment, and not part of the output)

rere

ttt

fff

dfsd

fgfg

fgfg

aaaaaaaaaaaaaaaaaa { and on and on }

dfdf

dfd

fdfd

fgfg

 

fgf

aaaaaaaaaaaaaaaa { and on and on }

quit

aaaaaaa { and on and on }

{program ends}

 

The behavior I wanted was for ‘a’ to be printed (almost) continuously, echo the relatively infrequent input, and quit upon receiving “quit”.

            I am aware (through a web search) that there was a mail thread addressing a similar issue a while back (1999) entitled:

                           I thought concurrent haskell was _preemptive_!

            That thread made it seem like the issue would be cleared up soon.

 

In any case, I would still like to be able to have an interactive input thread that doesn’t block everything in my program.

Is there any way to do this?

 

Thanks in advance,

            Walker