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