Lit*_*rum 18 multithreading haskell ioref
我在理解Haskell中IORef类型和MVar类型之间的基本区别时遇到了一些麻烦.有人可以帮我解决这个问题吗?他们似乎解决了同样的问题.MVar似乎是针对多线程的,但IORef有atomicModifyIORef函数.
谢谢!
tib*_*bbe 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(但仍可能存在争用,导致重试).