Foreign.Concurrent
| Авторские права | (c) Университет Глазго 2003 |
|---|---|
| Лицензия | BSD (см. файл libraries/base/LICENSE) |
| Поддержка | ffi@haskell.org |
| Стабильность | предварительная |
| Переносимость | непереносимая (требуется конкурентность) |
| Safe Haskell | Достоверный |
| Язык | Haskell2010 |
Описание
Типы данных FFI и операции, использующие или требующие конкурентности (только GHC).
Операции ForeignPtr, основанные на конкурентности
Эти функции обобщают свои аналоги в переносимом модуле Foreign.ForeignPtr, разрешая произвольные IO действия в качестве финализаторов. Эти финализаторы обязательно выполняются в отдельном потоке, см. Деструкторы, Финализаторы и Синхронизация, Ханс Боем, POPL, 2003.
newForeignPtr :: Ptr a -> IO () -> IO (ForeignPtr a) Источник
Преобразует обычную ссылку на память в внешний объект, ассоциируя с ссылкой финализатор — заданный монодической операцией. Управляющий хранилищем запустит финализатор в отдельном потоке некоторое время спустя после того, как последняя ссылка на ForeignPtr будет удалена. Нет гарантии своевременности, и, на самом деле, нет гарантии, что финализатор вообще будет выполнен.
Обратите внимание, что ссылки из финализатора не обязательно предотвращают финализацию другого объекта. Если финализатор A ссылается на B (возможно, используя touchForeignPtr, то единственная гарантия состоит в том, что финализатор B никогда не будет запущен до запуска финализатора A. Если оба A и B недоступны, оба финализатора запустятся вместе. См. touchForeignPtr для получения дополнительной информации о порядке финализаторов.
addForeignPtrFinalizer :: ForeignPtr a -> IO () -> IO () Источник
Эта функция добавляет финализатор к заданному ForeignPtr. Финализатор будет выполнен до всех других финализаторов для того же объекта, которые уже были зарегистрированы.
Это вариант addForeignPtrFinalizer, где финализатор — произвольное IO действие. При вызове финализатор будет выполнен в новом потоке.
ПРИМЕЧАНИЕ. Будьте очень осторожны с этими финализаторами. Распространённая ошибка заключается в том, что если финализатор ссылается на другой финализируемый объект, это не предотвращает финализацию этого объекта. В частности, Handle — это финализируемые объекты, поэтому финализатор не должен ссылаться на Handle (включая stdout, stdin, или stderr).
© 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/Foreign-Concurrent.html