Spec-Zone.ru › Haskell 9

Foreign.Concurrent

Авторские права (c) Университет Глазго, 2003
Лицензия В стиле BSD (см. файл libraries/base/LICENSE)
Сопровождающий ffi@haskell.org
Стабильность предварительная
Переносимость непереносимый (требуется поддержка параллелизма)
Безопасный Haskell Безопасный
Язык Haskell2010

Содержание

  • Операции ForeignPtr на основе параллелизма

Описание

Типы данных 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API