GHC.IOPort
| Авторские права | (c) Tamar Christina 2019 |
|---|---|
| Лицензия | см. libraries/base/LICENSE |
| Поддержка | ghc-devs@haskell.org |
| Стабильность | внутренняя |
| Переносимость | непереносимая (расширения GHC) |
| Безопасный Haskell | Нет |
| Язык | Haskell2010 |
Содержание
Описание
Тип IOPort. Это средство, используемое подсистемой ввода-вывода Windows.
API этого модуля нестабилен и не предназначен для использования широкой публикой. Если вам абсолютно необходимо от него зависеть, убедитесь, что вы используете жёсткий верхний предел, например, base < 4.X, а не base < 5, так как интерфейс может быстро меняться без предварительного предупреждения.
У нас есть жёсткие правила для порта ввода-вывода: * запись более одного раза — ошибка * чтение более одного раза — ошибка
Это даёт нам возможность заблокировать одну нить, дождаться результата от другой нити и затем быть разбуженными. *Ничего* больше.
Этот тип очень сильно связан с внутренней частью GHC. Он может быть изменён или удалён без предварительного уведомления в будущих релизах.
Порты ввода-вывода
IOPort — это синхронизирующая переменная, используемая для связи между конкурирующими нитями, где одна из нитей контролируется внешним состоянием. Например, действием ввода-вывода, которое обслуживается средой выполнения. Можно представить её как ящик, который может быть пустым или заполненным.
Она в основном похожа на поведение MVar, за исключением того, что writeIOPort не блокируется, если переменная заполнена, и сборщик мусора не будет принудительно освобождать блокировку, если посчитает, что есть тупик.
Свойства портов ввода-вывода: * Запись в пустой порт ввода-вывода не заблокирует. * Запись в заполненный порт ввода-вывода не заблокирует. Может выбросить исключение. * Чтение из порта ввода-вывода во второй раз может выбросить исключение. * Чтение из заполненного порта ввода-вывода не заблокируется, вернёт значение и очистит порт. * Чтение из пустого порта ввода-вывода будет блокироваться до записи. * Переиспользование порта ввода-вывода (то есть, чтение или запись дважды) не поддерживается и может выбросить исключение. Даже если чтения и записи чередуются.
Этот тип очень сильно связан с внутренней частью GHC. Он может быть изменён или удалён без предварительного уведомления в будущих релизах.
Примеры реализации
newIOPort :: a -> IO (IOPort a) Источник
Создать IOPort, содержащую предоставленное значение.
newEmptyIOPort :: IO (IOPort a) Источник
Создать IOPort, которая изначально пуста.
readIOPort :: IOPort a -> IO a Источник
Атомарно прочитать содержимое IOPort. Если IOPort в данный момент пуста, readIOPort будет ожидать, пока она не заполнится. После readIOPort, IOPort остаётся пустой.
Важное свойство readIOPort:
- Только одна нить может быть заблокирована на
IOPort.
writeIOPort :: IOPort a -> a -> IO Bool Источник
Поместить значение в IOPort. Если IOPort в данный момент заполнена, writeIOPort выбросит исключение.
Важное свойство writeIOPort:
- Только одна нить может быть заблокирована на
IOPort.
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/9.12.1/docs/libraries/base-4.21.0.0-8e62/GHC-IOPort.html