Коэффициент неоднозначности Clojure STM

В Clojure мы используем STM для параллелизма.

Мой вопрос заключается в том, что STM использует значение данных на момент времени, не приводит ли это к двусмысленности?

Как мы можем узнать, к какому значению осуществляется доступ?


person nish1013    schedule 19.06.2013    source источник


Ответы (2)


STM в Clojure предоставляет (через ref и dosync) контекст транзакции, в котором все обновления гарантированно выполняются "в одно и то же время" для всех задействованных ссылок, если смотреть из внешнего мира.

Цель состоит в том, чтобы поддерживать согласованность значений в системе, типичным примером является перевод денег между двумя банковскими счетами. Если вы переводите, скажем, 100 долларов со счета А на счет Б, вам нужно, чтобы суммы для А и Б менялись одновременно.

В этом примере на самом деле нет двусмысленности в значениях, считанных для сумм, которые обрабатываются внутри транзакции, потому что в момент чтения извне транзакции возможны только следующие ситуации:

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

Внутри транзакции ref, которые вы только читаете (но не изменяете), могут изменять свое значение от одной точки транзакции к другой, это называется перекосом записи (см. Программирование на Clojure — Глава 4, Ссылки, Запись перекос). Чтобы избежать этого, вы можете использовать ensure (вместо deref), это приведет к тому, что если изменится значение любого из этих ref (тех, которые вы только читаете), то вся транзакция будет повторена.

person juan.facorro    schedule 19.06.2013

Clojurians используют слова «время» и «ценность» с очень конкретными значениями в этом контексте, чтобы устранить такую ​​двусмысленность. В этом контексте «время» — это «время в последовательности» или эпохальное время, а не время, как время на стене. Таким образом, время описывает, какое значение в последовательности значений для этого идентификатора.

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

Я настоятельно рекомендую это видео о ценностях, состоянии и личности.

person Arthur Ulfeldt    schedule 19.06.2013