blob: 8ede02267764623c2701b755a0a8e04ce561338c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
import GHC.Conc.Sync
import Control.Monad
import System.Environment
test n = do
dog <- newTVarIO False
cat <- newTVarIO False
let unset = do
d <- readTVar dog
c <- readTVar cat
if (d || c) then retry else return ()
setDog = unset >> writeTVar dog True
setCat = unset >> writeTVar cat True
reset = do
d <- readTVar dog
c <- readTVar cat
guard (d || c)
writeTVar dog False
writeTVar cat False
replicateM_ n (do
forkIO (atomically setDog)
forkIO (atomically setCat)
atomically reset
atomically reset)
main = do
[n] <- getArgs
test (read n :: Int)
|