【问题标题】:ref-set vs commute vs alterref-set vs commute vs alter
【发布时间】:2011-06-27 07:45:41
【问题描述】:

在 Clojure 中设置 ref 值的 3 种方式有什么区别?我已经多次阅读有关 ref-set、commute 和 alter 的文档。我很困惑在什么时候使用哪些。谁能给我简要说明一下这些区别是什么以及为什么需要它们?

【问题讨论】:

    标签: clojure


    【解决方案1】:

    作为对软件事务内存系统如何在 clojure 中工作的超级简单的解释;它重试事务,直到每个人都通过而没有从它下面改变它的值。您可以通过使用 ref-changeing-functions 来帮助它做出这个决定,这些函数会提示它在事务之间的哪些交互是安全的。

    • ref-set 适用于您不关心当前值的情况。 只需将其设置为这个ref-set 为您节省了编写类似 (alter my-ref (fun [_] 4)) 之类的内容的焦虑,只是将 my-ref 的值设置为 4。(ref-set my-ref 4) 确实看起来好多了:)。
      使用 ref-set 来简单设置值。

    • alter是最普通的标准。使用此功能更改值。这是STM的肉。它使用您传递的函数来更改值,如果它不能保证从事务开始时值没有改变,它会重试。这是非常安全的,即使在某些情况下您不需要它是安全的,例如递增计数器。 您可能大部分时间都想使用alter

    • commute 是 alter 的优化版本,适用于那些事情的顺序真的无关紧要的时代。谁向计数器添加了哪个+1没有区别。结果是一样的。如果 STM 正在决定您的事务是否可以安全提交,并且它仅在通勤操作上存在冲突而在更改操作上没有冲突,那么它可以继续提交新值而无需重新启动任何人。这可以节省偶尔的事务重试,尽管您不会在普通代码中看到巨大的收益。
      尽可能使用commute p>

    【讨论】:

    • 所以要明白,如果值在写入发生之前发生变化,alter 会导致重试。它是在那个时候重试整个事务,还是只是重新调用alter的函数参数。
    • 事务始终获得一致的值,因此它会重新尝试整个事务。它比我的超级简短回答要聪明得多。值得自己研究
    猜你喜欢
    • 2010-11-21
    • 2014-12-18
    • 1970-01-01
    • 2010-12-03
    • 2018-07-22
    • 1970-01-01
    • 2021-07-16
    • 2011-03-04
    • 1970-01-01
    相关资源
    最近更新 更多