问题标签 [stm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scala - 任何使用软件事务内存的实际经验?
似乎最近对 STM(软件事务内存)框架和语言扩展的兴趣越来越大。 Clojure尤其具有出色的实现,它使用MVCC(多版本并发控制)而不是滚动提交日志。GHC Haskell 还有一个非常优雅的 STM monad,它也允许事务组合。最后,为了稍微吹嘘一下我自己的号角,我最近为 Scala 实现了一个 STM 框架,它静态地强制执行引用限制。
所有这些都是有趣的实验,但它们似乎仅限于那个领域(实验)。所以我的问题是:你们有没有人在现实世界中看到或使用过 STM?如果是这样,为什么?它带来了什么样的好处?性能呢?(在这一点上似乎有很多相互矛盾的信息)你会再次使用 STM 还是更喜欢使用其他一些并发抽象,比如演员?
locking - 我们是否要求过多的事务内存?
最近我一直在阅读很多关于事务性内存的文章。TM 有一些炒作,所以很多人都对它充满热情,它确实为痛苦的锁定问题提供了解决方案,但你也经常看到抱怨:
- 你不能做 I/O
- 你必须编写你的原子部分,以便它们可以运行多次(小心你的局部变量!)
- 软件事务内存性能不佳
- [在此处插入您的小毛病]
我理解这些担忧:通常情况下,您会发现有关 STM 的文章仅在某些特定硬件上运行,这些硬件支持一些非常漂亮的原子操作(如LL/SC),或者它必须由一些虚构的编译器支持,或者它需要所有对内存的访问都是事务性的,它引入了类型约束 monad 样式等。最重要的是:这些都是真正的问题。
这让我问自己:是什么反对本地使用事务内存来代替锁?这是否已经带来了足够的价值,还是必须在所有地方使用事务内存(如果使用的话)?
multithreading - 您如何实现软件事务内存?
就实际的低级原子指令和内存栅栏(我假设它们已被使用)而言,您如何实现 STM?
对我来说神秘的部分是,给定一些任意代码块,您需要一种方法来返回并确定每个步骤中使用的值是否有效。你如何做到这一点,以及如何有效地做到这一点?这似乎也表明,就像任何其他“锁定”解决方案一样,您希望您的关键部分尽可能小(以减少冲突的可能性),对吗?
此外,STM 是否可以简单地检测“另一个线程在执行计算时进入该区域,因此计算无效”或者它是否可以实际检测是否使用了破坏值(因此幸运的是,有时两个线程可能同时执行相同的关键部分而没有需要回滚)?
c - C 的 STM 哈希库(glib?)
我正在寻找一些包含 STM 样式(软件事务内存)哈希映射的 C 库,但到目前为止我没有运气。如果它基于 glib / gobject 那就太好了,但这并不是那么重要。它也不需要对许多对象进行适当的交易——我真正需要的是单一的不可变哈希支持。
必须具备:不可变的快照读取、自动重试的无锁写入。
clojure - 嵌套的 dosync 调用如何表现?
创建嵌套的 dosync 调用时会发生什么?子事务会在父范围内完成吗?如果父事务失败,这些子事务是否可逆?
multithreading - 使用线程级内存保护/分页时存在哪些运行时问题?
好的,所以我们今天支持每个进程的内存分页/保护。多年来,我一直想知道通过为我们的操作系统今天支持的可以说是最小的执行单元提供页面级保护可以获得什么样的好处:线程。 这个关于软件事务内存的问题让我回到了最前沿。
拥有页面级线程所有权的好处
- 操作系统支持在访问时锁定页面
- 从理论上讲,如果操作系统具有在线程生命周期内获取所有权的机制,则可以防止内存损坏。
缺点:
- 使用标准锁定技术进行死锁检测已经足够困难了
- 用于确定页面级所有权的调试器/操作系统支持
从支持这样的模型中你可以看到任何其他的缺点和优点吗?
java - Clojure STM (dosync) x Java 同步块
Clojure STM (dosync) 方法和 Java 同步 Block 有什么区别?
我正在从“睡觉的理发师”问题中阅读下面的代码。(http://www.bestinclass.dk/index.clj/2009/09/scala-vs-clojure-round-2-concurrency.html)
为了避免竞争条件,dosync
使用了,所以我问自己“与 Java 同步块有什么区别(STM)”?它会阻止这个关键代码吗?
提前致谢 !丹塔斯
haskell - Clojure、Haskell(和其他语言)在 STM 中使用了哪些算法?
据我了解,有几种不同的算法可以实现软件事务内存(这是一个非常活跃的研究领域)。我在哪里可以找到(无需深入研究源代码)在不同语言和库中使用的,特别是在 Clojure 和 Haskell (GHC) 中?
clojure - 我应该如何使 clojure STM 程序持久化?
我正在编写一个使用 STM 的 clojure 程序。目前我正在从数据库启动时填充 STM(使用 refs),然后在 dosync 事务成功时异步更新数据库。我不知道我是否以正确的方式执行此操作,或者是否有更好的标准技术来执行此操作。谁能向我解释他们如何在 Clojure 程序中将 STM 的 ACI 属性转换为 ACID?
haskell - Clojure STM 与 Haskell STM 有何不同?
我试图找出 Clojure 所称的 STM 与 Haskell 中实现的 STM 之间的区别。撇开实际的语言语义差异不谈,正如 Rich Hickey 在他的演讲中所说,Clojure 的 STM 实现与其他任何东西都非常不同,但我不理解除了语言选择之外的差异。