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

mah*_*dix 2 concurrency haskell functional-programming

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

fre*_*yle 6

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

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


加成

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