我在理解Haskell中IORef类型和MVar类型之间的基本区别时遇到了一些麻烦。有人可以帮我解决这个问题吗?他们似乎解决了同样的问题。 MVar似乎是针对多线程的,但IORef有atomicModifyIORef函数。
谢谢!
答案 0 :(得分:19)
MVar
的目标是多线程,而IORef
既可以用作单线程程序中的可变变量,也可以用作多线程程序中的同步构造。
IORef
可与atomicModifyIORef
一起使用以获得比较和交换(CAS)行为:作者和读者可以在IORef
存储的单个纯值上进行同步。读者使用readIORef
读取值,编写者使用atomicModifyIORef
写入值。请注意atomicModifyIORef
不允许编写者在临界区内执行任何副作用(即,在原子上更改值时,它们只能使用纯函数)。
MVar
允许您实现可能包含副作用的任意关键部分(使用withMVar
)。它们也可以像IORef
一样使用(如前一段所述),但成本较高。
如果你想直觉知道什么样的语义IORef
实现它与CAS语义相同Rich Hickey在关于Clojure的并发模型的讨论中描述:http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey
编辑:此外,您不能使用IORef
遇到死锁(但仍有争用,导致重试)。