Spec-Zone.ru › OCaml 5.0

Модуль Ephemeron

module Ephemeron: sig .. end

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

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

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

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

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

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

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

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

Примечания:

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

Эфемеры определены в лингвистически независимом виде в этой статье: B. Hayes, Ephemerons: A New Finalization Mechanism, OOPSLA'97

  • Since 4.03.0
  • Предупреждение 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-2022 INRIA.
https://v2.ocaml.org/releases/5.0/htmlman/libref/Ephemeron.html

Spec-Zone.ru

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