2013-06-19 2 views
4

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

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

Как мы можем узнать, к какой ценности обращаются?

ответ

4

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

Значение - неизменное содержимое идентификатора в определенный момент времени. Это значение может быть простым (примитивным или атомным значением) или составным и состоящим из произвольно структурированных неизменных значений. Важной частью является то, что значения не меняются, так что если вы хотите знать, какое значение было использовано, вы можете просто распечатать или войти он

Я очень рекомендую это видео на values, state and identity

8

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

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

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

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

Когда внутри сделки, ref s вы только для чтения (и не изменять) может изменить свое значение из одной точки сделки с другой стороны, это называется написать перекос (см Clojure Programming - Глава 4, Refs, Write Skew). Чтобы избежать этого, вы можете использовать ensure (вместо deref), это приведет к тому, что если значение для любого из этих ref s изменяется (те, которые вы только читаете), тогда вся транзакция будет повторена.

Смежные вопросы