Spec-Zone.ru › OCaml

Модуль 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
  • Внимание несинхронизированный доступ. Несинхронизированный доступ к слабым хеш-таблицам — это ошибка программирования.

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

Несинхронизированный доступ к слабой хеш-таблице может привести к недопустимому состоянию слабой хеш-таблицы. Таким образом, одновременный доступ к буферу должен быть синхронизирован (например, с помощью 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-2024 INRIA.
https://ocaml.org/manual/5.2/api/Ephemeron.html

Spec-Zone.ru

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