Как очень простое объяснение того, как система программной транзакционной памяти работает в недолговременном режиме; он повторяет транзакции до тех пор, пока все из них не пройдут без изменения значений из-под него. Вы можете помочь ему принять это решение, используя ref-change-functions, которые дают подсказки о том, какие взаимодействия безопасны между транзакциями.
ref-set
для случаев, когда вам не важно текущее значение. Просто установите его на ! ref-set
избавляет вас от необходимости писать что-то вроде (alter my-ref (fun [_] 4))
просто для установки значения my-ref равным 4. (ref-set my-ref 4)
конечно, выглядит намного лучше:).
Используйте ref-set
, чтобы просто установить значение.
alter
является наиболее нормальным стандартным. Используйте эту функцию, чтобы изменить значение. Это мясо СТМ. Она использует переданную вами функцию для изменения значения и повторяет попытку, если не может гарантировать, что значение не изменилось с начала транзакции. Это очень безопасно, даже в некоторых случаях, когда вам не нужно, чтобы это было , что безопасно, например, увеличение счетчика.
Вы, вероятно, хотите использовать alter
большую часть времени.
commute
- оптимизированная версия alter для тех случаев, когда порядок вещей действительно не имеет значения. не имеет значения, кто добавил +1 к счетчику. Результат тот же. Если STM решает, безопасна ли ваша транзакция для фиксации, и она имеет конфликты только при операциях коммутирования, а не при операциях изменения, тогда она может продолжить и зафиксировать новые значения без необходимости перезапуска никого. Это может сэкономить время от времени повторной попытки транзакции, хотя вы не увидите огромных выгод от этого в обычном коде.
Используйте commute
, когда можете.