如果一切都是不可变的,我们还需要互斥吗?

时间:2017-06-27 08:28:34

标签: haskell concurrency functional-programming

我注意到Haskell中有一个Mutex结构。我不明白它是如何工作的,因为我不是Haskell开发人员,但是如果每个变量都是不可变的(因为FP主张),为什么我们仍然需要一个互斥量?

2 个答案:

答案 0 :(得分:6)

实际上,所有变量都是不可变的。但是它们可以表示,例如,对象的引用,并且有一类函数允许您描述更改这些引用的内容的过程。如果类似的进程在另一个线程中,则会出现问题。

你可以说Haskell是一种建模语言。它很干净。但是它允许你模拟非纯计算,但是对不纯计算的实际工作会产生运行时(或通过FFI)。我们需要在我们的多线程编程模型中设计类似互斥的东西。

<强> ADDITION

我认为,如果你真的想了解为什么Haskell中存在类似mutex的东西,首先,你应该理解Haskell如何拥有一个函数,例如像readFile那样采用文件路径和返回其内容?问题是readFile必须是纯粹和不纯的,这是矛盾的。那么,在Haskell中这个悖论如何解决?试着回答这个问题,我相信你会通过这种方式了解更多的事情。

答案 1 :(得分:3)

我不太确定你在哪里找到一个名为Mutex的结构,但是如果你在谈论Data.Mutex,那就是Fay语言,这是一种javascript目标语言。

如果你在谈论Control.Concurrent.Lock,那就是自由式所说的是它正在建模锁定机制。

但是,更常用的进程间并发方式是使用所谓的软件事务内存,这使用Control.Monad.STM模块,它使用一种具有一种事务内存的形式自动锁定机制,大多数时候你不必担心手动锁定。当您考虑手动锁定时,这是相当惊人的。

Rich Hickey一直负责通过在Clojure语言中实现它来将这个想法进一步推向主流,但实际上这种机制允许应用程序级程序员不用担心手动锁定和同步机制的极端痛苦。由于不变性而读取非常快,并且写入会自动重放。西蒙·佩顿·琼斯(Simon Peyton Jones)就此发表了一篇论文,这里有一段关于他在一个名为“并行编程的交易记忆”的o'reilly会议上谈论它的视频的链接:https://www.youtube.com/watch?v=4caDLTfSa2Q