IORef和MVar有什么区别?

时间:2011-03-07 06:49:01

标签: multithreading haskell ioref

我在理解Haskell中IORef类型和MVar类型之间的基本区别时遇到了一些麻烦。有人可以帮我解决这个问题吗?他们似乎解决了同样的问题。 MVar似乎是针对多线程的,但IORef有atomicModifyIORef函数。

谢谢!

1 个答案:

答案 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遇到死锁(但仍有争用,导致重试)。