ref-set vs commute vs alter - PullRequest
       9

ref-set vs commute vs alter

54 голосов
/ 15 февраля 2011

В чем разница в 3 способах установки значения ссылки в Clojure?Я несколько раз читал документы о переустановке, замене и изменении.Я довольно запутался, какие из них использовать в какое время.Может ли кто-нибудь дать мне краткое описание того, в чем заключаются различия и зачем они нужны?

1 Ответ

88 голосов
/ 15 февраля 2011

Как очень простое объяснение того, как система программной транзакционной памяти работает в недолговременном режиме; он повторяет транзакции до тех пор, пока все из них не пройдут без изменения значений из-под него. Вы можете помочь ему принять это решение, используя 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, когда можете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...