Как действительно работает коммутация. (коммутируют IDENTITY FUNCTION & значения)Как работает коммутация?
Документация Clojure говорит:
Использование: (коммутируют исх весело & арг)
должен быть вызван в транзакции. Устанавливает значение in-transaction для ref:
(примените fun in-transaction-value-of-ref args) и возвращает значение in-transaction ref.
На момент совершения сделки, устанавливает значение рефа быть:
(применять удовольствие наиболее недавно совершенной стоимость, из-рефа арга)
Так форма коесть выполняется в две фазы.
является второй фазой атомным (применяется забава наиболее недавно совершенная стоимость, из-рефа арга)
, если нет, то что произойдет в этом примере: 2 Темы (Т1 и Т2).
Оба будут увеличивать (коммутативную функцию) тождество.
IDENTITY: (def i (ref 0)
(dosync (commute inc i))
Т1 в первом шаге вкл коммутируют вызова с исх = 0 (в стоимости сделки = 1)
Т1 остановки
Т2 в первой стадии вкл коммутируют вызова с исх = 0 (в стоимость сделки = 1)
Т2 остановки
T1 на втором этапе вызова снова вкл с недавним фиксации значения I = 0, возвращение функции вкл, но прежде, чем U бновить арбитр (я) Т1 остановки
Т2 на второй стадии вызова снова вкл с недавним фиксации значения I = 0 и обновление эталонного
T1 начать снова и обновить ссылку с ИНК возвращаемое значение = 1
Это проблема с состоянием гонки? как clojure избежать этого? , если вторая фаза будет атомарной, этого не произойдет.
Заранее спасибо
UPDATE: , если я правильно понимаю последний этап операций коммутируют (точка фиксации) синхронизировано «ЗАМОК коммутирует прикольные РАЗБЛОКИРОВАТЬ **»?
Nice Michaelle. поэтому, если я правильно понимаю, что последняя фаза коммутируемых операций (точка фиксации) синхронизируется «LOCK commute fun UNLOK»? – CHAPa