我在理解Haskell中的IORef类型和MVar类型之间的基本区别时遇到了一些问题。有人能帮我解决这个问题吗?它们似乎解决了同样的问题。MVar似乎是针对多线程的,但IORef有atomicModifyIORef功能。
谢谢!
发布于 2011-03-07 16:04:03
正如您所说,MVar的目标是多线程,而IORef既可以用作单线程程序中的可变变量,也可以用作多线程程序中的同步构造。
IORef可以与atomicModifyIORef一起使用,以获得比较和交换(CAS)行为:写入器和读取器可以对存储在IORef中的单个纯值进行同步。读取器使用readIORef读取值,写入器使用atomicModifyIORef写入值。请注意,atomicModifyIORef不允许编写者在临界区内执行任何副作用(即,当原子更改值时,它们只能使用纯函数)。
MVar允许您实现可能包含副作用的任意临界区(使用withMVar)。它们也可以像IORef一样使用(如上一段所述),但成本更高。
如果您想直观地了解哪种语义IORef实现了它,它与Rich Hickey在关于Clojure的并发模型:http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey的谈话中描述的CAS语义是一样的
编辑:此外,您不能使用IORef遇到死锁(但仍可能存在争用,从而导致重试)。
https://stackoverflow.com/questions/5216693
复制相似问题