В Clojure мы используем STM для параллелизма.
Мой вопрос заключается в том, что STM использует значение данных на момент времени, не приводит ли это к двусмысленности?
Как мы можем узнать, к какому значению осуществляется доступ?
В Clojure мы используем STM для параллелизма.
Мой вопрос заключается в том, что STM использует значение данных на момент времени, не приводит ли это к двусмысленности?
Как мы можем узнать, к какому значению осуществляется доступ?
STM в Clojure предоставляет (через ref
и dosync
) контекст транзакции, в котором все обновления гарантированно выполняются "в одно и то же время" для всех задействованных ссылок, если смотреть из внешнего мира.
Цель состоит в том, чтобы поддерживать согласованность значений в системе, типичным примером является перевод денег между двумя банковскими счетами. Если вы переводите, скажем, 100 долларов со счета А на счет Б, вам нужно, чтобы суммы для А и Б менялись одновременно.
В этом примере на самом деле нет двусмысленности в значениях, считанных для сумм, которые обрабатываются внутри транзакции, потому что в момент чтения извне транзакции возможны только следующие ситуации:
Внутри транзакции ref
, которые вы только читаете (но не изменяете), могут изменять свое значение от одной точки транзакции к другой, это называется перекосом записи (см. Программирование на Clojure — Глава 4, Ссылки, Запись перекос). Чтобы избежать этого, вы можете использовать ensure
(вместо deref
), это приведет к тому, что если изменится значение любого из этих ref
(тех, которые вы только читаете), то вся транзакция будет повторена.
Clojurians используют слова «время» и «ценность» с очень конкретными значениями в этом контексте, чтобы устранить такую двусмысленность. В этом контексте «время» — это «время в последовательности» или эпохальное время, а не время, как время на стене. Таким образом, время описывает, какое значение в последовательности значений для этого идентификатора.
Ценность — это неизменное содержание личности в определенный момент времени. Это значение может быть простым (примитивное или атомарное значение) или составным и состоять из произвольно структурированных неизменных значений. Важная часть заключается в том, что значения не меняются, поэтому, если вы хотите узнать, какое значение было использовано, вы можете просто распечатать или зарегистрировать его
Я настоятельно рекомендую это видео о ценностях, состоянии и личности.