Haskell STM并重试

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

但我想知道:

  • 如果我们读取一个STM变量,它在那个导致重试的特定分支中没有被实际使用,它会更新它尝试再次执行事务吗?

  • 线程被阻塞时,它是否真的被阻塞? 还是在线程池中回收以供其他潜在的等待操作使用?


  • 是。 读取STM变量将调用stmReadTVar - 请参阅此处。 这将在事务记录中生成新条目,并在提交时进行检查。 如果你看看这里,你会发现ReadTVarOp标记为带有副作用的操作(has_side_effects = True),所以我不认为编译器会消除它,无论你使用它的结果与否。
  • 正如@WillSewell所写的,Haskell使用绿色线程。 你甚至可以在单线程运行时使用STM,而不必担心实际的OS线程会被阻塞。

  • 回覆。 1:根据我的理解你的问题,是的,这是正确的; 您的整个STM交易将具有一致的世界观,包括与orElse组成的orElse (请参阅:https: orElse )。 但我不确定你的意思,“但我的交易实际上取决于只有一个变量的价值”; 如果你做了一个readTVar那么对这个var的更改将被跟踪。

    回覆。 2:你可以将绿色线程看作是保存的计算状态的块,它们存储在类似堆栈的东西中,然后弹出,运行一段时间,并在他们无法进一步取得进展时放回堆栈(“封锁”)或足够长的时间后。 并发发生的程度取决于您告诉运行时使用的操作系统线程的数量(通过+RTS -N )。 你可以有一个使用数千个绿色线程的并发程序,但只能在一个操作系统线程中运行,这很好。

    链接地址: http://www.djcxy.com/p/81461.html

    上一篇: Haskell STM and retry

    下一篇: friendly list as a change log