import Control.Monad import Control.Concurrent.MVar import Control.Concurrent import Text.Printf import System.Random import Queue fuzzDelay = False fuzz :: IO () fuzz = when fuzzDelay $ do seconds <- getStdRandom random :: IO Double threadDelay $ round (realToFrac (1000000 * seconds)) counterManager :: MVar Integer -> TaskQueue Integer -> TaskQueue [String] -> IO () counterManager counter counterQueue printerQueue = forever $ do fuzz incrementBy <- readQueue counterQueue fuzz newCount <- modifyMVar counter (\i -> return (i + 1, i + 1)) fuzz writeQueue printerQueue [printf "The count is %d" newCount, "---------------"] fuzz taskDone counterQueue printerManager :: TaskQueue [String] -> IO () printerManager queue = forever $ do fuzz rows <- readQueue queue fuzz mapM_ putStrLn rows fuzz taskDone queue main :: IO () main = do counter <- newMVar 0 counterQueue <- newQueue printerQueue <- newQueue forkIO $ counterManager counter counterQueue printerQueue forkIO $ printerManager printerQueue writeQueue printerQueue ["Starting up"] replicateM_ 10 (writeQueue counterQueue 1) joinQueue counterQueue writeQueue printerQueue ["Finishing up"] joinQueue printerQueue