Главная » Haskell » Модуль MVar

0

содержит определения программных сущностей, предназначенных для работы с переменными синхронизации,  которые  требуются для синхронизации управления между несколькими потоками. Данный модуль является

«подчинённым» по отношению к модулю Concurrent, поэтому его импорт выглядит следующим образом:

import Control.Concurrent.MVar

Кроме того, если модуль Concurrent  уже подключён, импортировать модуль

MVar нет необходимости.

Главный алгебраический тип данных, который определяет понятие переменной синхронизации,  определён в рассматриваемом модуле под идентификатором MVar. Данный тип является абстрактным и определён внутри транслятора языка Haskell. Для него также определены экземпляры классов Typeable1, Data и Eq.

Каждая  переменная  синхронизации может  быть пустой или  наполненной некоторой информацией, необходимой для синхронизации управления между потоками. Все описываемые ниже прикладные функции работают с такими переменными.

Функция: newEmptyMVar

Описание: создаёт пустую переменную синхронизации.

Определение:

newEmptyMVar  :: IO (MVar a)

Функция определена в виде примитива.

Функция: newMVar

Описание: создаёт переменную синхронизации,  содержащую внутри себя заданное значение.

Определение:

newMVar  :: a ->  IO  (MVar a)

Функция определена в виде примитива.

Функция: takeMVar

Описание: возвращает значение из заданной переменной  синхронизации. Если заданная переменная синхронизации пуста, то функция ожидает, пока она не получит значение. После возврата  функции заданная переменная синхронизации становится пустой. Если  исполнение программного кода  в нескольких потоках заблокировано этой функцией при помощи одной и той же переменной синхронизации, то при получении значения в эту переменную деблокируется только один поток (поскольку значение из переменной синхронизации вынимается). Остальные потоки ждут  своей очереди в порядке  блокировки (то  есть деблокировка происходит в порядке  FIFO).  Это важное свойство  функции можно использовать для управления несколькими потоками.

Определение:

takeMVar :: MVar a  ->  IO a

Функция определена в виде примитива.

Функция: putMVar

Описание: записывает заданное значение в переменную синхронизации. Если заданная переменная синхронизации уже  содержит значение,  функция putMVar будет ждать, пока переменная не станет пустой. Если исполнение программного кода в нескольких потоках заблокировано этой функцией при помощи одной и той же переменной синхронизации, то при записи значения в эту переменную деблокируется только один поток (остальные потоки ждут своей очереди  — используется принцип FIFO). Это важное свойство функции можно использовать для управления несколькими потоками.

Определение:

putMVar :: MVar a ->  a  ->  IO ()

Функция определена в виде примитива.

Функция: readMVar

Описание: эта функция является комбинацией функций takeMVar и putMVar. Она берёт значение из заданной переменной синхронизации, кладёт его обратно, но при этом возвращает полученное значение.

Определение:

readMVar ::  MVar a ->  IO a

readMVar m   = block   $ do a  < takeMVar  m putMVar  m   a return  a

Функция: swapMVar

Описание: заменяет значение в переменной синхронизации заданным значением.

Определение:

swapMVar  :: MVar a  -> a ->  IO a

swapMVar  mvar new = block   $ do old  < takeMVar  mvar putMVar  mvar new return  old

Функция: tryTakeMVar

Описание: неблокирующий вариант функции takeMVar. Эта функция немедленно пытается возвратить значение из заданной переменной синхронизации. Если переменная пуста, то функция не ожидает, когда она будет полной, а сразу возвращает значение Nothing. Если переменная синхронизации содержит некоторое значение, то это значение возвращается внутри конструктора Just,  а сама переменная синхронизации становится пустой.

Определение:

tryTakeMVar  :: MVar a ->  IO (Maybe a)

Функция определена в виде примитива.

Функция: tryPutMVar

Описание: неблокирующий вариант функции putMVar. Эта функция немедленно пытается записать значение в заданную переменную синхронизации. Если переменная уже содержит некоторое значение, функция возвращает False,  а переменная синхронизации  нового значения не получает. Если же  переменная синхронизации  пуста, она получает новое значение, а рассматриваемая функция возвращает True.

Определение:

tryPutMVar  :: MVar a ->  a ->  IO Bool

Функция определена в виде примитива.

Функция: isEmptyMVar

Описание: проверяет, пуста ли заданная переменная синхронизации.  Если пуста, возвращает значение True, если нет —  False  соответственно. Необходимо отметить, что эта функция возвращает  мгновенное отображение состояния переменной синхронизации,  которое  может измениться в следующий же  момент. Необходимо с осторожностью пользоваться этой функцией, а для гарантированного результата нужно использовать функцию tryTakeMVar.

Определение:

isEmptyMVar :: MVar a ->  IO Bool

Функция определена в виде примитива.

Функция: withMVar

Описание: безопасная обёртка для работы с содержимым переменных синхронизации. Эта функция безопасна с точки зрения отлова исключений. Она запишет значение в заданную переменную синхронизации даже в случае, если в процессе работы возникнет исключение. См. также описание модуля Exception  в разделе 7.4..

Определение:

withMVar  :: MVar a ->  (a  ->  IO b)  ->  IO b withMVar  m   io = block   $ do  a < takeMVar m

b < Exception.catch (unblock (io a))

(\e ->  do  putMVar  m  a throw  e)

putMVar  m  a return  b

Функция: modifyMVar-

Описание: безопасная обёртка для замены значения в переменной  синхронизации. Эта функция безопасна с точки зрения отлова  исключений. Она заменит содержимое заданной переменной синхронизации даже в случае, если в процессе работы возникнет исключение. Её работа подобна работе функции withMVar.

Определение:

modifyMVar_ :: MVar a ->  (a  ->  IO  a) ->  IO () modifyMVar_ m   io =  block $ do a   < takeMVar m

a’ < Exception.catch (unblock (io a))

(\e ->  do  putMVar  m  a throw  e)

putMVar  m  a’

Функция: modifyMVar

Описание:  небольшая вариация  функции   modifyMVar_,  которая   позволяет не только записать значение в переменную  синхронизации, но и вернуть значение в качестве результата своей работы.

Определение:

modifyMVar :: MVar a ->  (a  ->  IO (a,  b)) ->  IO b modifyMVar m   io = block   $  do  a             < takeMVar m

(a’, b)  < Exception.catch (unblock (io a))

(\e ->  do  putMVar  m  a throw  e)

putMVar  m  a’ return  b

Функция: addMVarFinalizer

Описание: добавляет финализатор в  заданную переменную   синхронизации. Функция определена только в поставке компилятора GHC. Описание финализаторов приведено в разделе 10.2. (модуль ForeignPtr) и подразделе 11.9.2. (модуль Weak).

Определение:

addMVarFinalizer :: MVar a ->  IO  () ->  IO ()

Функция определена в виде примитива.

Источник: Душкин Р. В., Справочник по языку Haskell. М.: ДМК Пресс, 2008. 544 с., ил.

По теме:

  • Комментарии