[Haskell-cafe] readMVar and the devils
Benjamin Franksen
benjamin.franksen at bessy.de
Tue Jul 6 05:32:01 EDT 2004
On Friday 02 July 2004 15:59, you wrote:
> > at a guess the magic take put is:
> >
> > block ( do
> > a <- takeMVar x
> > putMVar x a
> > )
> > return a
>
> This doesn't prevent the race condition Conor mentioned. It only
> prevents the thread executing the above code from being interrupted
> by an asynchronous exception (i.e., Control-C, or another thread
> killing this one). The only way to prevents race conditions is
> through discipline (take then put is one example).
True, but it's not the whole thruth.
<rant>
Is the next thing i'm going to hear "Haskell is a language for the
mature programmer" (~= what people who don't know better use to say
about C)? The great Pure Functional Language Haskell with the dead-safe
static type system (including all those sexy types) gives the
programmer nothing more to cope with concurrency than low-level MVars
together with imperative style programming.(?!?)
</rant>
Seriously: What the original poster needs is not discipline but a
suitable abstraction built on top of MVar. Like:
module MEVar (
MEVar, -- abstract
readMEVar,
...
) where
-- The 'E' in MEVar stands for 'exclusive read'
-- There are probably better names for this
import Control.Concurrent
newtype MEVar a = MVar (MVar a)
readMEVar :: MEVar a -> IO a
readMEVar outer = do
inner <- takeMVar outer
value <- takeMVar inner
putMVar inner value
putMVar outer inner
return value
...
Ben
More information about the Haskell-Cafe
mailing list