1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import Control.Concurrent
import Control.Concurrent.QSemN
import System.Environment
import System.Random
import Text.Printf

main = do { a:_ <- getArgs
          ; let n = read a
          ; q   <- newQSemN n
          ; g <- getStdGen
          ; let rs = randomRs (5,15) g
          ; mapM_ (forkIO . work q) (zip [1..n] rs)
          ; waitQSemN q n
          ; putStrLn "All threads finished"
          }

work :: QSemN -> (Int, Int) -> IO ()
work q (i,d) =  waitQSemN q 1
             >> threadDelay (d*10^6) 
             >> signalQSemN q 1
             >> printf "Theread N.o. %d filinshed\n" i