[Haskell-cafe] Race Condition in threads
Serguey Zefirov
sergueyz at gmail.com
Tue Dec 18 19:20:32 CET 2012
2012/12/18 mukesh tiwari <mukeshtiwari.iiitm at gmail.com>:
> Hello All
> I have two questions.
> 1. I wrote this code to create 10 simultaneous threads. Could some one
> please tell me if this is correct or not ?
>
> incr_count :: MVar () -> MVar Int -> IO ()
> incr_count m n = ( forM_ [ 1..10000 ] $ \_ -> modifyMVar_ n ( return . ( +
> 10 ) ) ) >> putMVar m ()
>
> main :: IO()
> main = do
> count <- newMVar 0
> list <- forM [1..10] $ \_ -> newEmptyMVar
> forM_ list $ \var -> forkIO . incr_count var $ count
> forM_ list $ \var -> takeMVar var
> val <- takeMVar count
> print val
It is pretty much correct (some comments would be nice, though).
> 2. I am trying to create race condition which makes the variable in
> inconsistent state. Could some one please tell me how to achieve this ? I
> look at IORef but it does not have function like modifyMVar_.
MVars are "atomic" in the sense that they have empty state and mutator
can wait until variable will have a value. So you have to operate with
something else, either IORef or with readMVar instead of takeMVar or
modifyMVar_.
> Mukesh Tiwari
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
More information about the Haskell-Cafe
mailing list