GHC.MVar
| Авторские права | (c) Университет Глазго 2008 |
|---|---|
| Лицензия | см. libraries/base/LICENSE |
| Поддержка | cvs-ghc@haskell.org |
| Стабильность | внутренняя |
| Переносимость | непереносимая (расширения GHC) |
| Безопасный Haskell | Небезопасный |
| Язык | Haskell2010 |
Содержание
Описание
Тип MVar
MVar
MVar (произносится "эм-вар") — это синхронизирующая переменная, используемая для коммуникации между конкурирующими потоками. Ее можно представить как ящик, который может быть пустым или заполненным.
Примеры реализации
newMVar :: a -> IO (MVar a) Источник
Создать MVar, содержащую указанное значение.
newEmptyMVar :: IO (MVar a) Источник
Создать MVar, которая изначально пуста.
takeMVar :: MVar a -> IO a Источник
Возвратить содержимое MVar. Если MVar в данный момент пусто, takeMVar будет ждать, пока оно не заполнится. После takeMVar, MVar остается пустым.
Есть две другие важные характеристики takeMVar:
-
takeMVarимеет одно пробуждение. То есть, если несколько потоков заблокированы вtakeMVar, иMVarстановится полным, только один поток будет разбужен. Система гарантирует, что разбуженный поток завершит своюtakeMVarоперацию. - Когда несколько потоков заблокированы на
MVar, они разбуживаются в порядке очереди FIFO. Это полезно для обеспечения свойств справедливости абстракций, построенных с использованиемMVar.
readMVar :: MVar a -> IO a Источник
Атомарно считать содержимое MVar. Если MVar в данный момент пусто, readMVar будет ждать, пока оно не заполнится. readMVar гарантируется, что получит следующее putMVar.
readMVar имеет множественное пробуждение, поэтому, когда несколько читателей заблокированы на MVar, все они разбуживаются одновременно.
Примечание по совместимости: До версии base 4.7, readMVar было комбинацией takeMVar и putMVar. Это означало, что при наличии других потоков, пытающихся putMVar, readMVar мог заблокироваться. Кроме того, readMVar не получал бы следующего putMVar, если уже существовал заблокированный ожидающий поток на takeMVar. Старое поведение можно восстановить, реализовав 'readMVar следующим образом:
readMVar :: MVar a -> IO a
readMVar m =
mask_ $ do
a <- takeMVar m
putMVar m a
return a
putMVar :: MVar a -> a -> IO () Source
Поместить значение в MVar. Если MVar в данный момент заполнен, putMVar будет ожидать, пока он не станет пустым.
Существуют две другие важные свойства putMVar:
-
putMVarявляется однократным пробуждением. То есть, если несколько потоков заблокированы вputMVar, иMVarстановится пустым, только один поток будет разбужен. Система гарантирует, что разбуженный поток завершит свою операциюputMVar. - Когда несколько потоков заблокированы на
MVar, они разбуживаются в порядке очереди FIFO. Это полезно для обеспечения свойств справедливости абстракций, созданных с использованиемMVar.
tryTakeMVar :: MVar a -> IO (Maybe a) Source
Неблокирующая версия takeMVar. Функция tryTakeMVar возвращается немедленно, с Nothing если MVar было пустым, или с Just a если MVar было заполнено содержимым a. После tryTakeMVar, MVar остается пустым.
tryPutMVar :: MVar a -> a -> IO Bool Source
Неблокирующая версия putMVar. Функция tryPutMVar пытается поместить значение a в MVar, возвращая True если это было успешно, или False в противном случае.
tryReadMVar :: MVar a -> IO (Maybe a) Source
Неблокирующая версия readMVar. Функция tryReadMVar возвращается немедленно, с Nothing если MVar было пустым, или с Just a если MVar было заполнено содержимым a.
С версии: base-4.7.0.0
isEmptyMVar :: MVar a -> IO Bool Source
Проверка, является ли заданный MVar пустым.
Обратите внимание, что возвращаемое булево значение — это всего лишь моментальный снимок состояния MVar. К моменту, когда вы отреагируете на его результат, MVar может быть заполнен (или опустошен) — поэтому будьте очень осторожны при использовании этой операции. Используйте tryTakeMVar вместо этого, если возможно.
addMVarFinalizer :: MVar a -> IO () -> IO () Source
Добавить финализатор к MVar (только GHC). См. Foreign.ForeignPtr и System.Mem.Weak для получения дополнительной информации о финализаторах.
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/8.10.2/docs/html/libraries/base-4.14.1.0/GHC-MVar.html