Модуль 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