.
, readMVar...
readMVar :: MVar a -> IO a
readMVar m =
mask_ $ do
a <- takeMVar m
putMVar m a
return a
... mask_, takeMVar. , ; readMVar, , takeMVar ; MVar, . ( ? , .)
modifyMVar modifyMVarMasked:
modifyMVar :: MVar a -> (a -> IO (a,b)) -> IO b
modifyMVar m io =
mask $ \restore -> do
a <- takeMVar m
(a',b) <- restore (io a) `onException` putMVar m a
putMVar m a'
return b
modifyMVarMasked :: MVar a -> (a -> IO (a,b)) -> IO b
modifyMVarMasked m io =
mask_ $ do
a <- takeMVar m
(a',b) <- io a `onException` putMVar m a
putMVar m a'
return b
... modifyMVar, (.. async, , ) io a, readMVar.
EDIT. readMVar mask_ -ed, , modifyMVarMasked modifyMVar ...
, , , yield ( readMVar) ( ), async, readVar ( , 4.6), .