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

0

Модуль  Concurrent   предлагает разработчику  программного   обеспечения обобщённый интерфейс для работы с несколькими потоками управления в программах. Однако необходимо  отметить,  что  многопоточность в языке  Haskell не входит в стандарт, а определяется расширениями.

Использование:

import Control.Concurrent

Данный модуль автоматически включает в себя импорт подчинённых модулей

Chan, MVar, QSem, QSemN и SampleVar, которые описываются ниже в этом разделе.

Многопоточность в языке  Haskell является «лёгкой», это означает,  что она не требует использования специализированных пакетов в операционных системах при работе с созданием потоков и с переключением контекстов. Работа с потоками обеспечивается  внутренними средствами системы реального времени языка Haskell.  Однако, если для целей программы при взаимодействии  с модулями, написанными на других  языках программирования, необходимо  использовать средства операционных  систем, можно пользоваться  функцией forkOS вместо функции forkIO (описание ниже).

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

Основным типом данных, который используется для работы с потоками, является алгебраический тип данных ThreadId. Этот тип является абстрактным, а потому определяется следующим  образом (на  самом деле он обрабатывается внутри трансляторов языка Haskell особым образом):

type  ThreadId  = ()

Этот тип представляет идентификатор потока. Для него определены экземпляры классов Data, Eq, Ord, Show и Typeable. Причём  экземпляр класса Ord используется для организации произвольного  порядка над потоками. Соответственно, экземпляр класса Show используется для вывода информации о потоках, что может быть использовано в целях отладки многопоточных программ.

Для работы с потоками в рассматриваемом модуле определены  следующие функции.

Функция: myThreadId

Описание: возвращает значение типа ThreadId для потока, из которого вызвана эта функция. Определена только в поставке компилятора GHC.

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

myThreadId ::  IO ThreadId

Функция: forkIO

Описание: отделяет от основного потока вычислений  ещё один, в котором производятся вычисления в рамках монады IO, которая передана первым аргументом. Соответственно, функция возвращает идентификатор созданного потока. Данная функция создаёт «легковесный» поток без использования возможностей операционных систем. Для создания потока с использованием таких  возможностей необходимо пользоваться функцией forkOS.

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

forkIO :: IO () ->  IO ThreadId

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

Функция: killThread

Описание: останавливает заданный поток, идентификатор которого передаётся в качестве первого аргумента. Любая работа, которая проводилась останавливаемым потоком, не теряется, поскольку вычисления приостанавливаются до тех пор, пока они требуются в других потоках. Память, которая используется останавливаемым потоком, очищается сборщиком мусора только тогда, когда на неё нет  больше ссылок извне. Функция  доступна только в поставке  компилятора GHC.

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

killThread ::  ThreadId  ->  IO ()

killThread tid  = throwTo  tid  (AsyncException  ThreadKilled)

Функция: throwTo

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

ток сможет остановить другой, коллизии не произойдёт. При этом если целевой поток на момент вызова функции занят какими-то внешними вызовами, исключения не произойдёт, функция не вернёт результата, а поэтому внешний вызов целевого потока завершится. Функция доступна только в поставке компилятора GHC.

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

throwTo  :: ThreadId  ->  Exception  ->  IO ()

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

Функция: yield

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

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

yield  :: IO  ()

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

Функция: threadDelay

Описание: останавливает текущий поток на заданное количество микросекунд. Нет гарантий того, что поток продолжит свою работу  ровно по истечению заданного интервала времени (в зависимости от планирования работы), но гарантируется то, что он не начнёт свою  работу раньше. Функция  доступна только в поставке компилятора GHC.

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

threadDelay :: Int  ->  IO ()

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

Функция: threadWaitRead

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

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

threadWaitRead  :: Fd  ->  IO ()

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

Функция: threadWaitWrite

Описание: блокирует текущий поток до тех пор, пока данные можно будет записать в заданный файл. Функция доступна только в поставке компилятора GHC. Определение:

threadWaitWrite ::  Fd ->  IO ()

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

Функция: mergeIO

Описание: создаёт потоки для обработки двух списков, которые начинают параллельно обрабатываться для последующего слияния результатов в одном списке. Функция доступна только в поставке компилятора GHC.

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

mergeIO :: [a] ->  [a] ->  IO [a]

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

Функция: nmergeIO

Описание: создаёт несколько потоков для обработки нескольких списков, которые начинают параллельно обрабатываться для последующего слияния результатов в одном списке. Функция доступна только в поставке компилятора GHC. Определение:

nmergeIO ::  [[a]] ->  IO [a]

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

Язык Haskell позволяет использовать средства операционных систем для работы с потоками. Не все трансляторы языка Haskell  поддерживают этот механизм. На текущий момент единственным  транслятором, который  поддерживает потоки операционных систем, является компилятор GHC. Все последующие функции реализованы только в его поставке.

Функция: rtsSupportsBoundThreads

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

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

rtsSupportsBoundThreads  :: Bool

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

Функция: forkOS

Описание: как  и  функция  forkIO,  отщепляет новый поток,  но  использует при этом средства операционной системы. Из-за этого  созданный поток становится ограничен свойствами текущей операционной системы.

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

forkOS  :: IO () ->  IO  ThreadId

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

Функция: isCurrentThreadBound

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

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

isCurrentThreadBound ::  IO Bool

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

Функция: runInBoundThread

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

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

runInBoundThread  :: IO a  ->  IO a

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

Функция: runInUnboundThread

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

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

runInUnboundThread :: IO a  ->  IO a

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

Дополнительную информацию об этом модуле и о технике  многопоточного программирования на языке Haskell можно получить из документации к модулю.

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

По теме:

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