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