RosettaCodeData/Task/Metered-concurrency/Haskell/metered-concurrency-1.hs
Ingy döt Net 776bba907c Sync
2013-10-27 22:24:23 +00:00

19 lines
522 B
Haskell

import Control.Concurrent
import Control.Monad
worker :: QSem -> MVar String -> Int -> IO ()
worker q m n = do
waitQSem q
putMVar m $ "Worker " ++ show n ++ " has acquired the lock."
threadDelay 2000000 -- microseconds!
signalQSem q
putMVar m $ "Worker " ++ show n ++ " has released the lock."
main :: IO ()
main = do
q <- newQSem 3
m <- newEmptyMVar
let workers = 5
prints = 2 * workers
mapM_ (forkIO . worker q m) [1..workers]
replicateM_ prints $ takeMVar m >>= print