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

0

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

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

import Control.Concurrent.SampleVar

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

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

Тип переменных синхронизации рассматриваемого вида является синонимом, который определён следующим образом:

type  SampleVar a = MVar (Int, MVar a)

Первое значение в паре обозначает состояние переменной синхронизации. Если оно равно 1, переменная содержит некоторое  значение. Если оно равно 0, переменная синхронизации пуста. Значение, меньшее 0, показывает (по модулю) количество заблокированных данной переменной синхронизации потоков.

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

Функции для работы с такими переменными синхронизации следующие.

Функция: newEmptySampleVar

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

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

newEmptySampleVar  :: IO  (SampleVar a) newEmptySampleVar  = do v  < newEmptyMVar

newMVar  (0, v)

Функция: newSampleVar

Описание: создаёт новую переменную синхронизации вида SampleVar с заданным начальным значением.

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

newSampleVar  :: a ->  IO  (SampleVar a) newSampleVar  a = do v  < newEmptyMVar

putMVar  v  a newMVar  (1,  v)

Функция: emptySampleVar

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

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

emptySampleVar :: SampleVar a ->  IO () emptySampleVar v  = do (readers, var)  < takeMVar v

if readers   > 0

then  do  takeMVar  var putMVar  v  (0,  var)

else  putMVar v  (readers,var)

Функция: readSampleVar

Описание: ожидает, когда заданная переменная синхронизации получает некоторое значение, считывает  его и возвращает.

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

readSampleVar ::  SampleVar a ->  IO a

readSampleVar svar  = do (readers, val)  < takeMVar svar putMVar svar  (readers 1, val) takeMVar val

Функция: writeSampleVar

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

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

writeSampleVar  :: SampleVar a  ->  a ->  IO ()

writeSampleVar  svar  v  = do (readers, val)  < takeMVar svar case  readers   of

1 ->  swapMVar  val   v  >> putMVar  svar  (1,val)

_ ->  putMVar val   v  >>

putMVar svar  (min  1 (readers + 1), val)

Функция: isEmptySampleVar

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

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

isEmptySampleVar :: SampleVar a ->  IO Bool

isEmptySampleVar svar  = do (readers, val)  < readMVar svar return  (readers == 0)

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

По теме:

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