Personal tools

Simple STM example

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
m (Category)
m (category)
Line 21: Line 21:
 
appV fn x = atomically $ readTVar x >>= writeTVar x . fn
 
appV fn x = atomically $ readTVar x >>= writeTVar x . fn
 
</haskell>
 
</haskell>
[[Categories:Monad]]
+
[[Category:Monad]]

Revision as of 18:55, 7 October 2006

module Main where
import Control.Monad
import Control.Concurrent
import Control.Concurrent.STM
 
main = do shared <- atomically $ newTVar 0
          before <- atomRead shared
          putStrLn $ "Before: " ++ show before
          forkIO $ 25 `timesDo` (dispVar shared >> milliSleep 20)
          forkIO $ 10 `timesDo` (appV ((+) 2) shared >> milliSleep 50)
          forkIO $ 20 `timesDo` (appV pred shared >> milliSleep 25)
          milliSleep 800
          after <- atomRead shared
          putStrLn $ "After: " ++ show after
 where timesDo = replicateM_
       milliSleep = threadDelay . (*) 1000
 
atomRead = atomically . readTVar
dispVar x = atomRead x >>= print
appV fn x = atomically $ readTVar x >>= writeTVar x . fn