Copyright | (c) The University of Glasgow 2001 |
---|---|
License | BSD-style (see the file libraries/base/LICENSE) |
Maintainer | libraries@haskell.org |
Stability | experimental |
Portability | non-portable (concurrency) |
Safe Haskell | None |
Language | Haskell2010 |
Synchronising, strict variables
Values placed in an MVar are evaluated to head normal form before being placed in the MVar, preventing a common source of space-leaks involving synchronising variables.
Synopsis
- data MVar a
- newEmptyMVar :: IO (MVar a)
- newMVar :: NFData a => a -> IO (MVar a)
- takeMVar :: MVar a -> IO a
- putMVar :: NFData a => MVar a -> a -> IO ()
- readMVar :: NFData a => MVar a -> IO a
- swapMVar :: NFData a => MVar a -> a -> IO a
- tryTakeMVar :: MVar a -> IO (Maybe a)
- tryPutMVar :: NFData a => MVar a -> a -> IO Bool
- isEmptyMVar :: MVar a -> IO Bool
- withMVar :: NFData a => MVar a -> (a -> IO b) -> IO b
- modifyMVar_ :: NFData a => MVar a -> (a -> IO a) -> IO ()
- modifyMVar :: NFData a => MVar a -> (a -> IO (a, b)) -> IO b
- addMVarFinalizer :: MVar a -> IO () -> IO ()
MVar
s
An MVar
(pronounced "em-var") is a synchronising variable, used
for communication between concurrent threads. It can be thought of
as a a box, which may be empty or full.
Instances
NFData1 MVar | Since: deepseq-1.4.3.0 |
Defined in Control.DeepSeq | |
Eq (MVar a) | Since: base-4.1.0.0 |
NFData (MVar a) | NOTE: Only strict in the reference and not the referenced value. Since: deepseq-1.4.2.0 |
Defined in Control.DeepSeq |
newEmptyMVar :: IO (MVar a) #
Create an MVar
which is initially empty.
Return the contents of the MVar
. If the MVar
is currently
empty, takeMVar
will wait until it is full. After a takeMVar
,
the MVar
is left empty.
There are two further important properties of takeMVar
:
takeMVar
is single-wakeup. That is, if there are multiple threads blocked intakeMVar
, and theMVar
becomes full, only one thread will be woken up. The runtime guarantees that the woken thread completes itstakeMVar
operation.- When multiple threads are blocked on an
MVar
, they are woken up in FIFO order. This is useful for providing fairness properties of abstractions built usingMVar
s.
putMVar :: NFData a => MVar a -> a -> IO () Source #
Put a value into an MVar
. If the MVar
is currently full,
putMVar
will wait until it becomes empty.
There are two further important properties of putMVar
:
putMVar
is single-wakeup. That is, if there are multiple threads blocked inputMVar
, and theMVar
becomes empty, only one thread will be woken up. The runtime guarantees that the woken thread completes itsputMVar
operation.- When multiple threads are blocked on an
MVar
, they are woken up in FIFO order. This is useful for providing fairness properties of abstractions built usingMVar
s.
tryTakeMVar :: MVar a -> IO (Maybe a) #
A non-blocking version of takeMVar
. The tryTakeMVar
function
returns immediately, with Nothing
if the MVar
was empty, or
if the Just
aMVar
was full with contents a
. After tryTakeMVar
,
the MVar
is left empty.
tryPutMVar :: NFData a => MVar a -> a -> IO Bool Source #
A non-blocking version of putMVar
. The tryPutMVar
function
attempts to put the value a
into the MVar
, returning True
if
it was successful, or False
otherwise.
isEmptyMVar :: MVar a -> IO Bool #
Check whether a given MVar
is empty.
Notice that the boolean value returned is just a snapshot of
the state of the MVar. By the time you get to react on its result,
the MVar may have been filled (or emptied) - so be extremely
careful when using this operation. Use tryTakeMVar
instead if possible.
withMVar :: NFData a => MVar a -> (a -> IO b) -> IO b Source #
withMVar
is a 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).
modifyMVar_ :: NFData a => MVar a -> (a -> IO a) -> IO () Source #
A safe wrapper for modifying the contents of an MVar
. Like withMVar
,
modifyMVar
will replace the original contents of the MVar
if an
exception is raised during the operation.
modifyMVar :: NFData a => MVar a -> (a -> IO (a, b)) -> IO b Source #
A slight variation on modifyMVar_
that allows a value to be
returned (b
) in addition to the modified value of the MVar
.
addMVarFinalizer :: MVar a -> IO () -> IO () #