競争

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

というわけで、ちょっとくりかえしてみたら、見事に非決定的なふるまいを見せてくれた