summaryrefslogtreecommitdiff
path: root/testsuite/tests/concurrent/should_run/conc023.hs
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)