Fills the MVar
if it is empty, or blocks (asynchronously)
if the MVar
is full, until the given value is next in
line to be consumed on take.
Fills the MVar
if it is empty, or blocks (asynchronously)
if the MVar
is full, until the given value is next in
line to be consumed on take.
This operation is atomic. *
a task that on evaluation will complete when the
put
operation succeeds in filling the MVar
,
with the given value being next in line to
be consumed
Tries reading the current value, or blocks (asynchronously) until there is a value available, at which point the operation resorts to a take followed by a put.
Tries reading the current value, or blocks (asynchronously) until there is a value available, at which point the operation resorts to a take followed by a put.
This read
operation is equivalent to:
for (a <- v.read; _ <- v.put(a)) yield a
This operation is not atomic. Being equivalent with a take
followed by a put
, in order to ensure that no race conditions
happen, additional synchronization is necessary.
See TaskSemaphore for a possible solution.
a task that on evaluation will be completed after a value has been read
Empties the MVar
if full, returning the contained value,
or blocks (asynchronously) until a value is available.
Empties the MVar
if full, returning the contained value,
or blocks (asynchronously) until a value is available.
This operation is atomic.
a task that on evaluation will be completed after a value was retrieved
A mutable location, that is either empty or contains a value of type
A
.It has 2 fundamental atomic operations:
The
MVar
is appropriate for building synchronization primitives and performing simple inter-thread communications. If it helps, it's similar with aBlockingQueue(capacity = 1)
, except that it doesn't block any threads, all waiting being done asynchronously by means of Task.Given its asynchronous, non-blocking nature, it can be used on top of Javascript as well.
Inspired by
Control.Concurrent.MVar
from Haskell and byscalaz.concurrent.MVar
.