- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我很难理解 Haskell 中 IORef 类型和 MVar 类型之间的基本区别。有人可以帮我解决这个问题吗?他们似乎解决了同样的问题。 MVar 似乎是针对多线程的,但是 IORef 有 atomicModifyIORef 功能。
谢谢!
最佳答案
MVar
就像你说的,目标是多线程,而 IORef
既可以用作单线程程序中的可变变量,也可以用作多线程程序中的同步构造。IORef
可与 atomicModifyIORef
一起使用获得比较和交换 (CAS) 行为:写入者和读取者可以同步单个纯值,存储在 IORef
中.读者使用readIORef
读取一个值,作者使用 atomicModifyIORef
写一个值。请注意 atomicModifyIORef
不允许编写者在临界区内执行任何副作用(即,他们只能在原子地更改值时使用纯函数)。MVar
允许您实现可能包含副作用的任意关键部分(使用 withMVar
)。它们也可以像 IORef
一样使用。 (如上一段所述),但成本更高。
如果你想知道什么样的语义IORef
实现它与 Rich Hickey 在关于 Clojure 并发模型的演讲中描述的 CAS 语义相同:http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey
编辑:此外,您不能使用 IORef
遇到死锁。 (但仍然可能存在争用,导致重试)。
关于multithreading - IORef 和 MVar 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5216693/
我正在尝试了解如何 IORefs确实用过,我在遵循我在 https://www.seas.upenn.edu/~cis194/spring15/lectures/12-unsafe.html 上找到的
我注意到 Data.UnionFind使用 IO monad 通过 IORefs 提供指针。我想每个人都高兴地调用unsafePerformIO在纯代码中本地使用它时,因为数据结构很好理解,但是..
一直让我困惑的一件事是现在是否适合使用 IORef。在决定是否对任务使用 IORef 时,是否应遵循任何准则?什么时候是使用 State monad 而不是 IORef 的好时机? 最佳答案 状态及其
我正在开发一个程序,该程序使用大量 IORef 数据类型。哪种方法更能节省内存/处理器效率: [IORef Foo] 或 IORef [Foo] 忽略我使用列表而不是向量或数组的事实。 最佳答案 使用
我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法,但与纯粹的惰性代码相比,它(也许并不奇怪)非常慢。 考虑一个非常简单的例子: module Main where import D
想知道如何最好地结合 Control.Lens与 IORef 一起封装。具体来说,我希望能够将 atomicModifyIORef 与镜头一起使用,以便我可以提供 a -> (a, b) 类型的函数并
我制作了以下特定于 IO monad 的函数: memoIO :: MonadIO m => m a -> IO (m a) memoIO action = do ref MRef r m a
我有一个写入 Map 和 PSQ 的主线程。在 Map 和 PSQ 中,我使用相同的键,以便通过查看 PSQ,可以以 O(1) 复杂度找到具有最小优先级的条目,并将其映射到 Map 中的值。 现在,虽
在 Haskell 中,有没有办法测试两个 IORef 是否相同?我正在寻找这样的东西: IORef a -> IORef a -> IO Bool 例如,如果您想可视化由 IORef 组成的图形,这
我找到了一些示例代码,并对其进行了一些更改 counter = unsafePerform $ newIORef 0 newNode _ = unsafePerformIO $
我想知道 是否有合法用途IORef 在 haskell ?更具体地说,如果有人可以解决以下问题或指向适当的地方以了解更多信息,我将不胜感激: 使用 IORef 是否被认为是一种糟糕的 Haskell
有代码读取 IORef 并根据一些条件和计算创建一个新值。现在它将新值写入该 IORef。但它有可能根本没有改变。新值可能与旧值相同。 在写入IORef之前是否检查值是否不同,或者直接写入IORef,
我很难理解 Haskell 中 IORef 类型和 MVar 类型之间的基本区别。有人可以帮我解决这个问题吗?他们似乎解决了同样的问题。 MVar 似乎是针对多线程的,但是 IORef 有 atomi
STRef 和 IORef 之间到底有什么区别,我什么时候使用它们?据我所知,它们都是可变状态,那么它们存在的意义何在? 最佳答案 您可以在 IO 中做更多的事情monad 比 ST单子(monad)
我正在对并发性和内存可见性进行一些实验,并遇到了这种奇怪的行为(请参阅内联评论): module Main where import Data.IORef import Control.Con
在chapter 7非常好的Write yourself a Scheme in 48 hours在解释语言中处理变量的环境(Scheme,其中变量是可变的)被引入为 type Env = IORef
我有一个长期运行的进程,它是 forkIO 'd,它产生像素颜色值: takesAgesToRun :: [[Color]] myForkedProcess :: IORef [[Color]] ->
通过保持 IORef 来通过异常来维护状态似乎要容易得多。而不是尝试使用 State Monad。下面我们有 2 个替代的 State Monad。一用StateT和另一个 ReaderT IORef
我有一个必须以互斥方式执行的操作。在其他语言中,我可以做类似的事情(类似Python的伪代码): with myLock: # here lock is acquired do mutual
我有一个必须以互斥方式执行的操作。在其他语言中,我可以做类似的事情(类似Python的伪代码): with myLock: # here lock is acquired do mutual
我是一名优秀的程序员,十分优秀!