我一直在学习函数式编程,并且可以肯定它可以使并行性更易于处理,但是我看不出它如何使共享资源的处理更容易。我已经看到人们谈论变量不变性是一个关键因素,但是这如何帮助两个线程访问同一资源?假设有两个线程将请求添加到队列中。他们俩都获得队列的副本,添加请求后进行新副本(因为队列是不可变的),然后返回新队列。第一个返回请求将被第二个覆盖,因为每个线程获得的队列副本没有其他线程的请求。因此,我假设在功能语言中提供了一种互斥锁的锁定机制?那这与命令性方法有什么不同?还是函数式编程的实际应用仍然需要一些命令性操作来处理共享资源?
答案 0 :(得分:0)
可以尽快更新您的全局数据。您正在打破纯粹的功能范式。从这个意义上讲,您需要某种命令结构。但是,这非常重要,以至于大多数功能语言都提供了一种方法来执行此操作,因此您需要它能够与世界其他地方进行通信。 (最复杂的形式是Haskell的IO
monad。)除了对某些其他同步库的简单绑定以外,如果可能的话,它们可能会尝试实现无锁,无等待的数据结构。
一些方法包括:
[(1,'a'), (2,'b'), (3,'c')]
,并且想通过将第三个条目更改为'g'
进行更新。如果将其表示为(3,'g'):originalList
,则可以使用新版本更新当前列表,并保持originalList
有效且不变。看到它的任何线程仍然可以安全地使用它。IO
monad来定义此参数,以确保顺序的内存一致性,但是几乎每种功能语言都可以通过某种方式与系统库交换数据。因此,功能语言确实提供了一些保证,这些保证对于有效的并发编程很有用。例如,大多数当前的ISA在最多只有一个编写器的情况下,不会在多个阅读器线程上增加额外的开销,某些一致性错误不会发生,并且功能语言非常适合表达这种模式。