Spec-Zone.ru › Haskell 8

GHC.MVar

Авторские права (c) Университет Глазго 2008
Лицензия см. libraries/base/LICENSE
Поддержка cvs-ghc@haskell.org
Стабильность внутренняя
Переносимость непереносимая (расширения GHC)
Безопасный Haskell Небезопасный
Язык Haskell2010

Содержание

  • MVar

Описание

Тип MVar

MVar

data MVar a Источник

MVar (произносится "эм-вар") — это синхронизирующая переменная, используемая для коммуникации между конкурирующими потоками. Ее можно представить как ящик, который может быть пустым или заполненным.

Конструкторы

MVar (MVar# RealWorld a)
Примеры реализации
Подробности реализации
Eq (MVar a)

С версии: base-4.1.0.0

Подробности реализации

Определено в GHC.MVar

Методы

(==) :: MVar a -> MVar a -> Bool Источник

(/=) :: MVar a -> MVar a -> Bool Источник

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API