【问题标题】:How does Clojure STM differ from Haskell STM?Clojure STM 与 Haskell STM 有何不同?
【发布时间】:2010-12-30 06:47:28
【问题描述】:

我试图找出 Clojure 所谓的 STM 与 Haskell 中实现的 STM 之间的区别。撇开实际的语言语义差异不谈,我有点困惑,正如 Rich Hickey 在他的演讲中所说的那样,Clojure 的 STM 实现与其他任何东西都非常不同,但除了语言选择之外,我不理解这些差异。

【问题讨论】:

    标签: haskell clojure stm language-comparisons transactional-memory


    【解决方案1】:

    Clojure STM 具有 3 大独特功能:

    1. 实现 MVCC 快照,避免在读取失效时重新启动事务。
    2. 确保对读写的引用提供了一种对资源获取顺序的手动控制。
    3. 具有显式通勤,可减少对可交换写入的重试。

    【讨论】:

    • 您是否还可以在此列表中添加非事务性读取的零开销?
    • 是的,当你使用非事务上下文时,但如果你考虑 STM 并在其他事务上重试,我不确定空洞系统是否会因上下文交换而影响性能。但 JVM 是非常成熟,STM就像一个GC……非常有必要,所以你应该这样想
    • 嗨,威廉。阅读 Mark volkmann 的文章和演示文稿时,他说“当 Ref 的历史列表不包含在 txn 开始之前提交的值时,读取只会触发 Clojure 中的重试”。上面描述的第一个特征是正确的?
    • @CHAPa 正确,reducingavoiding 更好。但通常只有在特殊情况下(缓慢读取和快速频繁写入)才会发挥作用。
    • Clojure 的 STM 遇到了一个众所周知且尚未解决的特殊问题,即如果长时间运行的事务被较短的事务抢占,它们可能永远无法完成。我不确定 Haskell 是否有类似的问题。
    【解决方案2】:

    对于 Haskell STM,请参阅 SPJ 的论文:http://research.microsoft.com/en-us/um/people/simonpj/papers/stm/

    特别有用的是“可组合内存事务”和“具有数据不变量的事务内存”。 GHC 的 STM 实现确实不是 MVCC。我不记得所有的实现细节,但我的理解是论文中的描述与 GHC 目前存在的描述并没有太大的不同。

    (请注意,在 clojure 或其他地方,MVCC 可能会导致写入偏斜——例如,请参见此处:http://en.wikipedia.org/wiki/Snapshot_isolation

    【讨论】:

    • 另外值得注意的是,GHC 的实现提供了关于副作用的事务安全性的编译时保证;以及用于原子组合事务的独特 orElse 组合器。
    • @DonStewart 此外,Haskell STM 是一个MonadPlus,它允许您在事务上下文中指定其他失败条件。即,如果最终账户余额为负,则失败/重试 txn。它还允许您轻松地与其他 MonadPlus 类共享该逻辑;给定帐户和购买的List,相同的函数将显示所有潜在有效交易的结果。如果逻辑很复杂,这可能很有用。我认为在 clojure 中两者都不可能。
    【解决方案3】:

    Mark Volkmann 在 Strange Loop 2009 上对 STM(尤其是 Clojure 的 STM)进行了非常详细的介绍,您可以找到 here(文章和幻灯片 here)。我真的不知道任何其他资源(除了代码)来理解 Clojure 的 STM 是如何工作的。

    【讨论】:

    • 演示链接失效。有人可以替代这个演讲吗?
    • 演示幻灯片和有关该主题的详细文章可在此处获得java.ociweb.com/mark/stm/article.html
    • 读得真好。非常方便。沃尔克曼先生是一位天才作家。
    • 哪里有沃尔克曼先生演讲的录音?
    猜你喜欢
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多