The action is atomic as long as while one thread is using withMVar another thread isn't using putMVar

On Sun, Jul 18, 2021 at 6:49 AM Harendra Kumar <harendra.kumar@gmail.com> wrote:
The documentation of withMVar (in Control.Concurrent.MVar module of base package) says:

{-|
  'withMVar' is an exception-safe wrapper for operating on the contents
  of an 'MVar'.  This operation is exception-safe: it will replace the
  original contents of the 'MVar' if an exception is raised (see
  "Control.Exception").  However, it is only atomic if there are no
  other producers for this 'MVar'.
-}
withMVar :: MVar a -> (a -> IO b) -> IO b
withMVar m io =
  mask $ \restore -> do
    a <- takeMVar m
    b <- restore (io a) `onException` putMVar m a
    putMVar m a
    return b

Can someone shed some light on what is meant by the statement - 
"However, it is only atomic if there are no other producers for this 'MVar'."?
I hope this is the right mailing list for this question.
Thanks,
Harendra

_______________________________________________
Libraries mailing list
Libraries@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries


--
Eric Mertens