【发布时间】:2014-04-16 17:05:41
【问题描述】:
我在多个地方都看到过这种说法,包括在 SO:https://stackoverflow.com/a/20467457/243238、https://stackoverflow.com/a/4400389/243238。我的意思是修改数据不需要锁,但在并发修改后你最终会得到它的多个版本。这在实践中似乎不是很有用。我试图用下面的一个简单场景来描述这一点:
假设我们有 2 个线程 A 和 B。它们都在修改纯函数字典 D。此时它们不需要锁,因为数据是不可变的,因此它们输出新的字典 DA 和 DB。现在我的问题是如何协调 DA 和 DB,以便以后的操作可以看到数据的单一视图?
编辑:答案建议在 DA 和 DB 上使用 merge 函数。我看不出这是如何解决问题的,因为可能有另一个线程 C 与合并操作同时运行。声称纯函数式数据结构是无锁的,但使用合并函数听起来更像是最终一致性,这是另一回事。
【问题讨论】:
-
这不是您问题的答案,但我认为如果您想共享对数据结构的修改,您应该考虑使用
STM作为discussed in this tutorial。
标签: multithreading haskell data-structures functional-programming