- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,一些背景。我想要一个队列,我想以两种不同模式之一操作。在第一种模式下,如果队列中存在一个元素,我希望能够检索一个元素,但如果没有元素,则不阻塞。在第二种模式下,我希望能够阻塞直到队列有一个元素。 (我知道我可以为每种模式使用专门的机制,但我想排除一些通用代码,因此如果我可以对两种操作模式使用相同的机制,那将是最简单的。)
我可以使用 Chan
,但根据文档我不应该使用 isEmptyChan
因为它由于潜在的死锁而被弃用。这给我留下了TChan
. tryReadTChan
函数给了我我想要的第一种模式(即我可以检查一个元素是否存在而不阻塞)但我不确定readTChan
做。我的心智模型是 atomically
block 将继续重试,直到 channel 中存在一个元素,这意味着它将忙于循环浪费 CPU 周期;这与 readChan
不同(即非 STM 版本)它(如果我理解正确的话)实际上会阻止线程的执行,直到一个元素可用,因为运行时线程调度程序可以理解 MVars。TChan
也是如此喜欢 Chan
如果我使用 readTChan
运行时足够聪明,在值可用之前不会调度调用线程?还是会浪费大量 CPU 周期不断轮询一个值到达?
最佳答案
STM 阻塞(通过 retry
)的行为就像它立即重试事务一样,但实现更智能:由于 STM 会跟踪您在事务进行时读取的变量,因此它知道事务的行为方式相同只要这些变量具有相同的值。因此,当事务失败时,它会阻塞(实际上不会重试),直到您使用的变量之一发生更改。在 TChan
的情况下s,这意味着它会阻塞,直到有人写入 TChan
.
我推荐 Simon Marlow 的 slides在并发和并行 Haskell 上很好地介绍了 STM(除其他外)。
关于haskell - 读取 Tchan 会导致阻塞或轮询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14545436/
我有一个 TChan 作为线程的输入,它的行为应该是这样的: 如果 sombody 在特定时间内写入 TChan,则应检索内容。如果在指定时间内没有写入任何内容,则应解除阻塞并继续 Nothing .
首先,一些背景。我想要一个队列,我想以两种不同模式之一操作。在第一种模式下,如果队列中存在一个元素,我希望能够检索一个元素,但如果没有元素,则不阻塞。在第二种模式下,我希望能够阻塞直到队列有一个元素。
我想在两个线程之间实现一个管道。我有线程 A 获取数据、处理数据并将其发送到线程 B。我有一个 MVar 检查数据是否已完全处理 但是,我有一个异常*** Exception: thread inde
考虑以下代码(和错误): import Control.Lens import Control.Monad.STM import Control.Monad.IO.Class import Contr
我想为线程手动创建 TChan 邮箱,其中传入的消息/网络数据包与来自本地线程的消息收集在同一队列中。 我不确定这里典型的 Haskell 方法是什么。我怎么能写从例如一个套接字到一个 TChan 邮
如果 STM 事务失败并重试,是否调用 writeTChan重新执行,以便最终进行两次写入,或者 STM 是否仅在事务提交时才实际执行写入?即,这个解决 sleep 理发师问题的方法是否有效,或者如果
我们有一些东西可以在 TChan 上转储值,然后由消费者处理这些值。但消费者无法跟上,因此当生产者在 channel 上倾倒大量内容时,我们会使用大量内存,但消费者却无法跟上。如果 channel 队
我是一名优秀的程序员,十分优秀!