标签: ioref

State,ST,IORef和MVar之间的区别

我正在通过48小时为自己编写一个方案(我大约85小时)而且我已经完成了关于添加变量和赋值的部分.本章中有一个很大的概念性跳跃,我希望它分两步完成,两者之间有很好的重构,而不是直接跳到最终的解决方案.无论如何…

我已经得到了一些不同类的,似乎达到相同的目的失去了:State,ST,IORef,和MVar.文本中提到了前三个,而最后三个似乎是许多关于前三个问题的StackOverflow问题的最佳答案.它们似乎在连续调用之间都处于状态.

这些是什么以及它们如何彼此不同?


特别是这些句子没有意义:

相反,我们使用一个名为状态线程的功能,让Haskell为我们管理聚合状态.这使我们可以像在任何其他编程语言中一样处理可变变量,使用函数来获取或设置变量.

IORef模块允许您在IO monad中使用有状态变量.

所有这一切都使这条线路type ENV = IORef [(String, IORef LispVal)]混乱 - 为什么第二个IORef呢?如果我写的话会破坏什么type ENV = State [(String, LispVal)]

variables monads haskell state-monad ioref

87
推荐指数
3
解决办法
1万
查看次数

什么时候可以使用IORef?

让我困惑的一件事是,是否可以使用IORef.在决定是否使用IORef执行任务时是否应遵循任何指导原则?什么时候是使用州立大学的好时机而不是IORef?

monads state haskell ioref

62
推荐指数
2
解决办法
9565
查看次数

在纯代码中避免使用IORef

我注意到Data.UnionFind使用IO monad通过IORefs提供指针.我想大家都很乐意unsafePerformIO在纯代码中本地使用它,因为数据结构很好理解,但是......

这种数据结构是否有规范的清洁方法?也许是IO的包装,unsafePerformIO通过禁止大多数IO操作,不可避免地"不安全""看"?

monads haskell data-structures union-find ioref

25
推荐指数
1
解决办法
846
查看次数

什么时候使用STRef或IORef?

STRef和IORef的区别究竟是什么?我何时使用它们?据我所知,他们两个都是可变状态所以它们​​两者存在的意义何在?

haskell ioref

20
推荐指数
2
解决办法
2491
查看次数

IORef和MVar有什么区别?

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

谢谢!

multithreading haskell ioref

18
推荐指数
1
解决办法
1490
查看次数

关于IORef操作在并发程序中重新排序的推理

文件说:

在并发程序中,IORef操作可能无序地出现在另一个线程上,具体取决于底层处理器体系结构的内存模型......需要实现以确保重新排序内存操作不会导致类型正确的代码进入错误.特别是,当检查从IORef读取的值时,内存写入创建该值必须从当前线程的角度发生.

我甚至不完全确定如何解析.爱德华杨

换句话说,"我们不保证重新排序,除了你不会有任何类型安全违规."......最后一句话说明IORef不允许指向未初始化的内存

所以...它不会破坏整个哈希尔; 不是很有帮助.记忆模型例子的讨论也给我留下了问题(甚至Simon Marlow似乎有些惊讶).

从文档中我可以清楚地看到的事情

  1. 在一个线程中,atomicModifyIORef"永远不会在任何早期的IORef操作之前,或者在任何后来的IORef操作之后发生",即我们得到一个部分排序:在原子模块之上的东西 - >原子模型 - >之后的东西.虽然,这里的措辞"从未被观察到",但暗示了我没有预料到的怪异行为.

  2. readIORef x之前可能会移动A writeIORef y,至少在没有数据依赖性时

  3. 从逻辑上讲,我没有看到类似的东西readIORef x >>= writeIORef y可以重新排序

有什么不清楚的

  • newIORef False >>= \v-> writeIORef v True >> readIORef v永远回来True吗?

  • maybePrint案件中(来自IORef文档)之前readIORef myRef(可能是一个seq或某个东西)readIORef yourRef会强制重新排序的障碍吗?

我应该有什么直截了当的心理模型?是这样的:

从单个线程的角度来看,IORef操作的顺序将显得健全和顺序; 但是编译器实际上可能以一种在并发系统中破坏某些假设的方式重新排序操作; 但是当一个线程执行时 atomicModifyIORef,没有线程会观察到之后IORef出现的操作 atomicModifyIORef,反之亦然.

...?如果没有,上面的更正版本是什么?

如果你的回答是"不使用IORef的并行代码,使用TVar"请说服我用具体的事实和那种事情,你的具体例子不能与推理IORef.

concurrency haskell ghc ioref

10
推荐指数
1
解决办法
437
查看次数

在共享IORef时,只要我使用atomicModifyIORef编写,使用readIORef读取是否安全?

如果我IORef在多个线程之间共享,并使用atomicModifyIORef写入它:

atomicModifyIORef ref (\_ -> (new, ()))
Run Code Online (Sandbox Code Playgroud)

用普通的旧版读取价值是否安全readIORef?或者有可能readIORefatomicModifyIORef修改后在另一个线程中返回旧值吗?

我认为这就是文档所暗示的:

atomicModifyIORef充当重新排序的障碍.多个atomicModifyIORef操作以严格的程序顺序发生.在任何早期(在程序顺序中)IORef操作之前,或在任何后来的IORef操作之后,都不会发现atomicModifyIORef.

我只是想确定一下.

haskell thread-safety ioref

9
推荐指数
1
解决办法
860
查看次数

atomicModifyIORef的额外结果参数的目的是什么?

签名modifyIORef很简单:

modifyIORef :: IORef a -> (a -> a) -> IO ()
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不是线程安全的.有一个替代方案可以解决这个问题:

atomicModifyIORef :: IORef a -> (a -> (a,b)) -> IO b
Run Code Online (Sandbox Code Playgroud)

这两个功能之间到底有什么区别?b在修改IORef可能从另一个线程读取的参数时,我应该如何使用该参数?

concurrency haskell global-state ioref

9
推荐指数
2
解决办法
268
查看次数

Haskell:IORefs的表现

我一直在尝试在Haskell中编码一个需要使用大量可变引用的算法,但与纯粹的惰性代码相比,它(可能并不奇怪)非常慢.考虑一个非常简单的例子:

module Main where

import Data.IORef
import Control.Monad
import Control.Monad.Identity

list :: [Int]
list = [1..10^6]

main1 = mapM newIORef list >>= mapM readIORef >>= print
main2 = print $ map runIdentity $ map Identity list
Run Code Online (Sandbox Code Playgroud)

在我的机器上运行GHC 7.8.2,main1需要1.2秒并使用290MB内存,而main2只需0.4秒,仅使用1MB.是否有任何阻止这种增长的技巧,特别是在太空?我经常需要IORef非原始类型的s Int,并且假设一个人IORef会像常规thunk一样使用额外的指针,但我的直觉似乎是错误的.

我已经尝试了一个带有解压缩的专用列表类型IORef,但没有显着差异.

performance haskell ioref

8
推荐指数
2
解决办法
1396
查看次数

显示IO类型

我有一个数据类型,其中包含IORef作为一个重要元素.这意味着没有一种干净的方法可以使它成为show类型类的成员.这不是太糟糕,因为我print在这种类型的IO monad中有一个函数.但是在GHCi中很烦人,因为每当我返回其中一个东西时,我都会收到错误声明它无法显示.

有没有办法让IOC无论如何在IO monad中运行,使用IO动作来显示结果?如果没有,是否会对写作产生任何负面影响show a = unsafePerformIO $ print a

haskell ghci unsafe-perform-io io-monad ioref

7
推荐指数
1
解决办法
2200
查看次数