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 与合并操作同时运行。声称纯函数式数据结构是无锁的,但使用合并函数听起来更像是最终一致性,这是另一回事。
很好的观察。但这仅仅意味着存在“全局状态”的并行性是困难的或不可能的,无论编程语言如何。
在不纯的语言中,这不太明显。你可能认为你可以摆脱锁定、同步和围绕它的所有高度复杂的代码。
而在纯语言中,您有n纯状态转换器,并且不得不意识到,如果将它们并行应用到某个初始状态,S0您最终会得到如此多的状态S1, S2, S3...Sn
现在,纯度只是保证 的并行转换S0不会以任何方式相互干扰。它不能解决您的程序设计问题,例如该状态的含义,是否可能太粗糙或太细粒度,以及您是否可以从各种转换状态计算最终结果。