atomic MVar overwrite (was RE: [Haskell-cafe] How to use QSem?)

S. Alexander Jacobson haskell at alexjacobson.com
Wed Jun 23 12:46:15 EDT 2004


Basically, what I want is a tryReadSampleVar
function.

Or, if we stick with MVars, I don't want another
thread to operate between the tryTakeMVar and the
putMVar.  In particular, I don't want another
thread to believe (mistakenly) that the mvar is
empty when it is simply being updated.

I suppose I could define a new abstraction where I
have a second mvar that acts as an exclusive lock
on the the first MVar.  e.g.

   data XMVar a = XMVar (MVar ()) MVar a

   overWriteXMVar (XMVar lock mvar) val =
	withMVar lock (\_->tryTakeMVar mvar >> putMVar mvar val)
   tryTakeXMVar (XMVar lock mvar) val =
	withMVar lock (\_->tryTakeMVar mvar)

But, I think it would be more sane simply to
have a tryReadSampleVar somewhere.

-Alex-

_________________________________________________________________
S. Alexander Jacobson                  mailto:me at alexjacobson.com
tel:917-770-6565                       http://alexjacobson.com

On Wed, 23 Jun 2004, Simon Marlow wrote:

> On 23 June 2004 17:13, S. Alexander Jacobson wrote:
>
> > Ah, that worked.  Thank you. The MVar
> > documentation is also very brief.
> >
> > I would also like to overwrite the contents of an
> > MVar atomically regardless of whether it is full
> > or empty.  I am current using.
> >
> >   overWrite mvar val = tryTakeMVar mvar >> putMVar mvar val
> >
> > But it is not atomic :-(  The lib functions
> > (modifyMVar and tryPutMVar) are atomic but seem to
> > require that you know in advance the MVar's state.
>
> The question to ask here is "atomic with respect to what?".  modifyMVar
> is atomic only with respect to other threads performing modifyMVar-type
> operations on the MVar (i.e. take followed by put).  If another thread
> is doing repeated puts into the MVar, then modifyMVar's atomicity is
> defeated.
>
> There isn't really a problem here, you just need to be sure that you use
> your MVars in a consistent way - you can always define a new abstraction
> that doesn't permit operations to be performed in the wrong order.
>
> So in order to tell you how to write your overWrite function, we need to
> know what other operations are being concurrently performed on the MVar,
> and what invariants you expect to hold.
>
> Cheers,
> 	Simon
>



More information about the Haskell-Cafe mailing list