On Fri, Dec 16, 2005 at 05:46:33PM +0100, Peter Eriksen wrote:
> Here's the code:
> 
> > module Main where
> > 
> > import Control.Concurrent
> > import Control.Concurrent.STM
> > import System.Random
> > 
> > worker :: Int -> TVar Int -> IO ()
> > worker id tv = do
> >     sleepingTime <- randomRIO (0, 50000)
> >     threadDelay sleepingTime 
> >     putStr $ show id
> >     atomically $ barrier tv id
> >     worker id tv

You've got the barrier after the putStr, so there's nothing to make the
first ten putStrs be in order.  I think you need a non-updating barrier
before the putStr and then an updating function after the putStr (to tell
the next worker that it is free to print).

> barrier :: TVar Int -> Int -> STM ()
> barrier tv id = do
>       passed <- readTVar tv
>       if (passed `mod` 10 == id) 
>               then writeTVar tv (passed+1)
>               else retry

> move_along :: TVar Int -> Int -> STM ()
> barrier tv id = do passed <- readTVar tv
>                    writeTVar tv (passed+1)

> worker :: Int -> TVar Int -> IO ()
> worker id tv = do
>       sleepingTime <- randomRIO (0, 50000)
>       threadDelay sleepingTime 
>       atomically $ barrier tv id
>       putStr $ show id
>       atomically $ move_along tv id
>       worker id tv
-- 
David Roundy
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to