^^^^^ finished (sorry)On 2012-06-30, at 1:51 PM, Mauricio Hernandes wrote:Eternal Gratitude for the help, it's working perfectly, I will consider the exceptions and other stuff now.the code looks like this nowimport System.IOimport Control.Concurrentimport Data.Listimport Control.Monadmain = dofinished <- newEmptyMVarinput <- newMVar [1..30000]ia <- newEmptyMVarib <- newEmptyMVaric <- newEmptyMVarforkIO $ do x <- readMVar inputputMVar ia xputMVar finished ()forkIO $ do a <- readMVar iaputMVar ib ( sum a )putMVar finished ()forkIO $ do a <- readMVar iaputMVar ic ( reverse a )putMVar finished ()b <- readMVar ibc <- readMVar icwriteFile "somaEprod.txt" (show b ++ "\n")appendFile "somaEprod.txt" (show c)replicateM_ 3 (takeMVar finished)Just another Haskell beginner here, so beware...You've moved the readMVar out of a thread into the application. This means (I think) that you are waiting for values in both ib and ic in the application (rather than a fourth thread). In your specific program, for these to have values require that all three threads have completed so you don't need the finished MVar anymore. However, this is pretty fragile being completely dependent on the MVars being set exactly once as the threads complete (so if you modify the code you have to be careful). The found solution is also fragile as
_______________________________________________Felipe says in his post. I don't know what those libraries Felipe mentioned are but I think I'd be looking for them right about now if I were you :-)Cheers,Bob_______________________________________________ValeuMauricioOn Sun, Jul 1, 2012 at 12:24 AM, Felipe Almeida Lessa <felipe.lessa@gmail.com> wrote:
Your application is exiting before your forkIOs get a chance to
execute. Instead of
forkIO $ do
...
forkIO $ do
...
forkIO $ do
...
use something like
finished <- newEmptyMVar
forkIO $ do
...
putMVar finished ()
forkIO $ do
...
putMVar finished ()
forkIO $ do
...
putMVar finished ()
replicateM_ 3 (takeMVar finished)
Doing so will avoid your program to exit until all threads have finished.
Note that the code above is extremely fragile: doesn't handle
exceptions, you have to manually specify the number of threads that
you opened, etc. These are abstracted by some libraries on Hackage
that you may use later for Real World Code (TM).
Cheers, =)
--
Felipe.
Beginners mailing list
Beginners@haskell.org
http://www.haskell.org/mailman/listinfo/beginners
Beginners mailing list
Beginners@haskell.org
http://www.haskell.org/mailman/listinfo/beginners