blob: b128c224a3bbce9fc7ee52a239b89287e3df6ea1 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
{-# LANGUAGE ScopedTypeVariables #-}
-- !!! test threadDelay, Random, and QSemN.
-- start a large number (n) of threads each of which will wait for a
-- random delay between 0 and m seconds. We use a semaphore to wait
-- for all the threads to finish.
import System.Random
import Control.Concurrent
import Control.Exception
n = 5000 -- no. of threads
m = 3000 -- maximum delay
main = do
s <- newQSemN n
(is :: [Int]) <- sequence (take n (repeat (getStdRandom (randomR (1,m)))))
mapM (fork_sleep s) is
waitQSemN s n
where
fork_sleep s i = forkIO (do waitQSemN s 1
threadDelay (i*1000)
signalQSemN s 1)
|