競争
Peyton Jones さんの講演にあった、レースコンディションの実例をやってみる
import Data.IORef import Control.Concurrent times :: Int -> IO a -> IO a times n action = if n > 1 then do { action ; times (n - 1) action } else action incR x = do tmp <- readIORef x writeIORef x (tmp + 1) main = do x <- newIORef 0 forkIO $ times 100000 $ incR x times 100000 $ incR x threadDelay 1000000 y <- readIORef x putStrLn $ show y
$ runghc sample_race.hs 200000 $ runghc sample_race.hs 200000 $ runghc sample_race.hs 198224 $ runghc sample_race.hs 198888 $ runghc sample_race.hs 196774
というわけで、ちょっとくりかえしてみたら、見事に非決定的なふるまいを見せてくれた