On 12/29/05, Brian Sniffen <brian.sniffen@gmail.com> wrote:
> test_Cubby =
> do
> tv <- newTVar 0
You've almost got it! But "newTVar 0" has type STM Tvar, and you're
trying to use it in the IO monad. So just say "tv <- atomically
(newTVar 0)" and you're set. Do notice that you'll see output like
this:
co"nisnusmeer t6 "6
"
"c"oinnssuemret 61""
""cionnsseurmte 95""
""icnosnesrutm e2 "9
since the two threads are interleaved.
--
Brian T. Sniffen
bts@alum.mit.edu or
brian.sniffen@gmail.com
http://www.evenmere.org/~bts
Thank you all for your help and comments ...
module Main where
import System.Random
import Control.Concurrent
import Control.Concurrent.STM
forever act = act >> forever act
test_Cubby =
do
tv <- atomically (newTVar 0)
forkIO (forever $ producer tv) >> (forever $ consumer tv)
where
producer tv = do r <- randomRIO (1,10)
atomically (do { v <- readTVar tv
; writeTVar tv (v+r)
})
print ("insert " ++ show r)
threadDelay r
consumer tv = do r <- randomRIO (1,10)
atomically (do { v <- readTVar tv
; if (v < r) then retry
else writeTVar tv (v-r)
})
print ("consume " ++ show r)
threadDelay r
I also slow it down a bit to get readable output ... thanks again.
- Quan