blob: 7cb570912951a09a1a81e78fbb18a6f733d0afb5 (
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
|
{-# LANGUAGE RecursiveDo, ScopedTypeVariables #-}
import Control.Concurrent
import Control.Exception
import Data.Array
import System.Random
import System.Environment
import Control.Monad
import GHC.Conc
import Data.IORef
main = do
r <- newIORef 0
rec
t1 <- mask $ \restore -> forkIO (thread restore r t2)
t2 <- mask $ \restore -> forkIO (thread restore r t1)
threadDelay 1000000
readIORef r >>= print . (/= 0)
thread restore r t = run
where
run = (restore $ forever $ do killThread t
i <- atomicModifyIORef r (\i -> (i + 1, i))
evaluate i)
`catch` \(e::SomeException) -> run
|