Haskell STM 并重试

Haskell STM and retry

当我们 运行 一个命中 retrySTM 表达式时,线程被阻塞,如果条目被修改,事务将再次 运行。

但我想知道:

  1. 是的。读取 STM 变量将调用 stmReadTVar - 请参阅 here. This will generate new entry in transaction record and it will be checked on commit. If you take a look here 你会发现 ReadTVarOp 标记为具有副作用的操作(has_side_effects = True)所以我认为编译器不会消除它,无论你是否使用它结果与否。
  2. 正如@WillSewell 所写Haskell 使用绿色线程。您甚至可以在单线程运行时使用 STM,而不必担心实际 OS 线程会被阻塞。

回复。 1:据我了解你的问题,是的,这是正确的;您的整个 STM 交易将具有一致的世界观 包括 orElse 组成的分支(参见:https://ghc.haskell.org/trac/ghc/ticket/8680)。但是我不确定 "but my transaction actually depends on the value of just 1 variable" 是什么意思;如果您执行 readTVar,那么将跟踪对该变量的更改。

回复。 2:您可以将绿色线程视为保存的计算状态块,它们存储在类似堆栈的东西中并弹出,运行 一段时间,当它们无法取得进一步进展时放回堆栈暂时 ("blocked") 或在 运行 足够长的时间之后。这种情况并行发生的程度取决于 OS 线程的数量 您告诉 运行 使用时间(通过 +RTS -N)。你可以有一个使用数千个绿色线程的并发程序,但只有 运行 个 OS 线程,这完全没问题。