问题标签 [ioref]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - readIORef 是如何工作的:创建副本还是不创建?
这段代码究竟做了什么?someMap
对象 (of ::Data.Map.Strict.Map
) 的副本是由引用myMap
还是仅作为引用?我的意思是在我阅读后可以someMap
改变(通过另一个线程)readIORef
?像 C 的 volatile 之类的东西……有可能吗?我希望它是复制/快照,因此任何更改都不会影响我的someMap
, 或 ...?
haskell - IORef 的内存占用和性能
如果我知道 a 的大小是 x,我想知道 IORef a 类型的变量的内存占用是多少。此外,与 Java 中的常规变量赋值(如 x = 3)相比,应用于整数的函数 writeIORef 的预期性能是什么?
haskell - `readIORef` 怎么会是阻塞操作
这对我来说完全是一个惊喜。readIORef
当有atomicModifyIORef
飞行时,有人可以解释阻塞背后的原因是什么吗?我知道假设是提供给后一个函数的修改函数应该非常快,但这不是重点。
这是一个示例代码,它重现了我正在谈论的内容:
运行这段代码会产生:
请注意,readIORef: Wating ...
它只打印两次,一次是在阻塞之前,一次是在阻塞之后。这是非常出乎意料的,因为它是一个在完全独立的线程中运行的动作。这意味着阻塞IORef
会影响其他线程而不是调用的线程readIORef
,这更令人惊讶。
这些语义是预期的,还是一个错误?我适合不是错误,为什么这是预期的?稍后我会打开一个 ghc 错误,除非有人对此行为有我想不出的解释。这是 ghc 运行时的一些限制,我不会感到惊讶,在这种情况下,我稍后会在这里提供答案。无论结果如何,了解这种行为都非常有用。
编辑 1
在评论中请求了我尝试过的不需要的繁忙循环unsafePerformIO
,所以在这里
结果完全相同,只是运行时略有不同。
编辑 2
事实证明,这sayString
是没有输出没有出现的原因。这是 outsayString
被交换时的内容putStrLn
:
那仍然没有回答问题,为什么要readIORef
阻止。事实上,我偶然发现了 Samuli Thomasson 的《Haskell High Performance》一书中的一句话,它告诉我们不应该发生阻塞:
haskell - Haskell 中 IORef 的行为
在 GHCI(版本 9.0.1)中,以下给出了我所期望的:
但是当我以这种方式尝试同样的事情时:
返回一个空列表,就好像修改从未发生过一样。为什么会这样?输出不应该相同吗?