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

S. Alexander Jacobson haskell at alexjacobson.com
Wed Jun 23 12:13:26 EDT 2004


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.

Is there a solution to this or do I have to
refactor?

-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 22 June 2004 21:44, S. Alexander Jacobson wrote:
>
> > The GHC documentation on QSem is very sparse.  I
> > would like to give a thread exclusive access to a
> > resource.
> >
> > My *guess* based on the documentation is that I
> > can create an exclusive lock using:
> >
> >    logSem <- newQSem 1
>
> If the maximum value of your QSem is 1, then an MVar will do.  That is,
> an MVar can be used as a simple semaphore, and a QSem is necessary if
> you need a quantity semaphore (there are > 1 units of the resource).
>
> > And then any thread that wants to lock the
> > resource uses:
> >
> >    withLogSem x = do waitQSem logSem; y <- x; signalQSem logSem;
> > return y
> >
> > as follows:
> >
> >    withLogSem $ rotate curLogPos
>
> import Control.Concurrent, create the semaphore like this:
>
>    m <- newMVar ()
>
> and use it like this:
>
>    withMVar m $ \_ -> ... critical section ...
>
> If you are using the semaphore to protect a mutable variable, then you
> can handily merge the two ideas into an MVar, which behaves like a
> thread-safe mutable variable.
>
> Cheers,
> 	Simon
>



More information about the Haskell-Cafe mailing list