纯函数式数据结构总是无锁的吗?

Dan*_*kov 5 multithreading haskell functional-programming data-structures

我已经看到了这个权利的几个地方,包括SO:/sf/answers/1432722021//sf/answers/308027261/。我明白修改数据不需要锁,但在并发修改后最终会得到它的多个版本。这在实践中似乎不是很有用。我试图用下面的简单场景来描述这一点:

假设我们有 2 个线程 A 和 B。它们都在修改纯函数字典 D。此时它们不需要锁,因为数据是不可变的,因此它们输出新的字典 DA 和 DB。现在我的问题是如何协调 DA 和 DB,以便以后的操作可以看到数据的单一视图?

编辑:答案建议merge在 DA 和 DB上使用函数。我看不出这是如何解决问题的,因为可能有另一个线程 C 与合并操作同时运行。声称纯函数式数据结构是无锁的,但使用合并函数听起来更像是最终一致性,这是另一回事。

Ing*_*ngo 5

很好的观察。但这仅仅意味着存在“全局状态”的并行性是困难的或不可能的,无论编程语言如何。

在不纯的语言中,这不太明显。你可能认为你可以摆脱锁定、同步和围绕它的所有高度复杂的代码。

而在纯语言中,您有n纯状态转换器,并且不得不意识到,如果将它们并行应用到某个初始状态,S0您最终会得到如此多的状态S1, S2, S3...Sn

现在,纯度只是保证 的并行转换S0不会以任何方式相互干扰。它不能解决您的程序设计问题,例如该状态的含义,是否可能太粗糙或太细粒度,以及您是否可以从各种转换状态计算最终结果。


ang*_*son 1

您创建第三个函数,采用 DA 和 DB 来生成 DAB。