Skip to content
try3.hs 1.24 KiB
Newer Older
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