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 now


import System.IO
import Control.Concurrent
import Data.List 
import Control.Monad

main = do
          finished <- newEmptyMVar
          input <- newMVar  [1..30000]
          ia <- newEmptyMVar
          ib <- newEmptyMVar
          ic <- newEmptyMVar

          forkIO $ do x <- readMVar input
                      putMVar ia x
                      putMVar finished ()

          forkIO $ do a <- readMVar ia
                      putMVar ib ( sum a )
                      putMVar finished ()

          forkIO $ do a <- readMVar ia
                      putMVar ic ( reverse a )
                      putMVar finished ()

          b <- readMVar ib
          c <- readMVar ic
          writeFile "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





Valeu
Mauricio

On 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

----
Bob Hutchison
Recursive Design Inc.