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
