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 будет удалена. Нет гарантии своевременности, и, на самом деле, нет гарантии, что финализатор когда-либо выполнится при срабатывании финализации сборщиком мусора.
При срабатывании финализации явным вызовом finalizeForeignPtr, финализатор выполнится немедленно в текущем потоке Haskell.
Обратите внимание, что ссылки из финализатора не обязательно предотвращают финализацию другого объекта. Если финализатор А ссылается на Б (возможно, используя touchForeignPtr, то единственной гарантией является то, что финализатор Б никогда не будет запущен до финализатора А. Если оба А и Б недоступны, то оба финализатора будут запущены вместе. См. 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/9.12.1/docs/libraries/base-4.21.0.0-8e62/Foreign-Concurrent.html