6

我想知道 Clojure 怎么可能已经实现了软件事务内存并且没有看到任何问题,而微软没有完成 C# 的工作并注意到一些问题使得实现此处描述的 STM 不切实际:http: //www.bluebytesoftware.com/blog/2010/01/03/ABriefRetrospectiveOnTransactionalMemory.aspx

请问有什么想法吗?

4

2 回答 2

5

Clojure 几乎从影响语言设计和语言使用方式的语言开始就开始使用 STM,以使他们的 STM 实用。C# 必须从现有的语言和现有的使用方式开始,这导致了一个更困难的问题。最重要的区别是Clojure 的 STM 从语言核心的不可变数据开始,然后在其之上构建身份概念,而 STM 在身份概念之上构建。还值得注意的是,它们有许多不同种类的 STM,而 clojure 的 STM 非常不同。

于 2013-06-24T17:07:20.860 回答
3

STM有许多不同的方法。这是一个非常广泛的主题,例如“类型系统”:一种方法很容易成功,而其他方法由于各种不同的原因而失败。

Clojure 的 STM 有一些设计决策,使其在恕我直言,比以前的方法更实用和有效:

  • 不会尝试使用 STM 保护任意数据- 您必须使用特殊的托管引用,例如 (ref和类似的)。这使得它比许多早期的 STM 方法更简单、更集中的设计(这包括 Microsoft 的方法,至少如上面链接的文章中所述)
  • 它使用不可变数据的多版本并发控制。这使得事务处理更加有效和实用。特别是,这意味着非事务性读取不需要任何锁定,这是一个巨大的性能提升......
  • 它是在函数式语言的上下文中完成的——特别是,Clojure 中的大多数代码在默认情况下都是无副作用的,这使得应用事务重试等技术变得更加容易。

由于这些设计决策,Clojure 的 STM 与以前的 STM 方法截然不同,我认为成功是因为其新颖的设计。下面的视频有点陈旧,但如果您想大致了解它的工作原理,则非常棒:

http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey

于 2013-06-26T16:59:57.293 回答