Spec-Zone.ru › OCaml

Модуль Ephemeron

module Ephemeron: sig .. end

Эфемероны и слабые хеш-таблицы.

Эфемероны и слабые хеш-таблицы полезны, когда нужно кэшировать или запоминать результат вычисления функции, пока используются её аргументы и сама функция, не создавая утечек памяти из-за постоянного хранения результатов старых вычислений, которые больше не нужны, поскольку один из аргументов или функция освобождены. Реализация с использованием Hashtbl.t не подходит, поскольку все ассоциации будут сохранять аргументы и результат в памяти.

Эфемероны также можно использовать, чтобы «добавить» поле к произвольному упакованному значению OCaml: к значению, созданному внешней библиотекой, можно прикрепить некоторую информацию без утечек памяти.

Эфемероны содержат несколько ключей и одно или ни одного значения данных. Все они являются упакованными значениями OCaml. Ключи эфемерона ведут себя так же, как слабые указатели с точки зрения сборщика мусора. Фактически слабые указатели OCaml реализованы как эфемероны без данных.

Ключи и данные эфемерона считаются заполненными, если они указывают на значение, и пустыми, если значение никогда не задавалось, было сброшено или удалено сборщиком мусора. В функции, обращающейся к ключам или данным, эти два состояния представлены типом option.

Сборщик мусора считает данные живыми, если все заполненные ключи живы и сам эфемерон жив. Когда сборщик мусора перестаёт считать один из ключей живым, данные удаляются из эфемерона. Данные могут оставаться живыми по другой причине, и в этом случае сборщик мусора не освободит их, однако эфемерон больше не будет их содержать.

Эфемероны усложняют понятие живости значений, поскольку оно больше не эквивалентно достижимости от корневого значения с помощью обычных указателей (не слабых и не эфемеронов). Для эфемеронов понятие живости определяется как наименьшая неподвижная точка следующего правила: значение живо, если:

  • оно является корневым значением
  • оно достижимо из живого значения с помощью обычных указателей
  • оно является данными живого эфемерона, все заполненные ключи которого живы

Примечания:

  • Все типы, определённые в этом модуле, нельзя сериализовать с помощью output_value или функций модуля Marshal.

Эфемероны определены в этой статье независимо от языка программирования: B. Hayes, «Эфемероны: новый механизм финализации», OOPSLA'97

  • Начиная с версии 4.03
  • Предупреждение unsynchronized_access. Несинхронизированный доступ к слабым хеш-таблицам является ошибкой программирования.

Несинхронизированный доступ

Несинхронизированный доступ к слабой хеш-таблице может привести к её недопустимому состоянию. Поэтому параллельный доступ к слабой хеш-таблице необходимо синхронизировать (например, с помощью Mutex.t).

module type S = sig .. end

Выходная сигнатура функторов Ephemeron.K1.Make и Ephemeron.K2.Make.

module type SeededS = sig .. end

Выходная сигнатура функторов Ephemeron.K1.MakeSeeded и Ephemeron.K2.MakeSeeded.

module K1: sig .. end

Эфемероны с одним ключом.

module K2: sig .. end

Эфемероны с двумя ключами.

module Kn: sig .. end

Эфемероны с произвольным числом ключей одного типа.

© 1995-2026 INRIA.
https://ocaml.org/manual/5.5/api/Ephemeron.html

Spec-Zone.ru

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