Foreign.Concurrent
| Авторские права | (c) Университет Глазго, 2003 |
|---|---|
| Лицензия | В стиле BSD (см. файл libraries/base/LICENSE) |
| Сопровождающий | ffi@haskell.org |
| Стабильность | предварительная |
| Переносимость | непереносимый (требуется поддержка параллелизма) |
| Безопасный Haskell | Безопасный |
| Язык | Haskell2010 |
Содержание
Описание
Типы данных FFI и операции, использующие параллелизм или требующие его (только GHC).
Операции ForeignPtr на основе параллелизма
Эти функции обобщают одноимённые функции переносимого модуля Foreign.ForeignPtr, позволяя использовать произвольные действия IO в качестве финализаторов. Такие финализаторы неизбежно выполняются в отдельном потоке; см. Деструкторы, финализаторы и синхронизация Ханса Бёма, POPL, 2003.
newForeignPtr :: Ptr a -> IO () -> IO (ForeignPtr a) Исходный код
Преобразует обычную ссылку на память во внешний объект, связывая со ссылкой финализатор, задаваемый монадической операцией.
Когда сборщик мусора запускает финализацию, менеджер памяти запустит финализатор в отдельном потоке через некоторое время после того, как будет удалена последняя ссылка на ForeignPtr. Гарантии быстрого выполнения нет; более того, при финализации, вызванной сборщиком мусора, нет гарантии, что финализатор вообще когда-либо будет запущен.
Если финализация запускается явным вызовом finalizeForeignPtr, финализатор немедленно выполнится в текущем потоке Haskell.
Обратите внимание, что ссылки из финализатора не обязательно препятствуют финализации другого объекта. Если финализатор 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/9.14.1/docs/libraries/base-4.22.0.0-66f8/Foreign-Concurrent.html