繁体   English   中英

Haskell STM并重试

[英]Haskell STM and retry

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

但我想知道:

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

  • 线程被阻止时,它是否真的被阻止了? 或者它是否在线程池中回收以供其他可能等待的操作使用?

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

回覆。 1:据我了解你的问题,是的,这是正确的; 您的整个STM事务将具有一致的世界视图, 包括orElse组成的orElse (请参阅: httpsorElse )。 但我不确定你的意思是“但我的交易实际上取决于只有1个变量的价值”; 如果您执行readTVar ,则将跟踪对该var的更改。

回覆。 2:您可以将绿色线程视为已保存计算状态的块状物,这些块状物存储在类似堆栈的物体中并弹出,运行一段时间,并在它们暂时无法进一步进展时放回到堆栈中(“阻止”)或在他们跑了足够长的时间之后。 并行发生的程度取决于您告诉运行时使用的OS线程数(通过+RTS -N )。 你可以有一个使用数千个绿色线程的并发程序,但只能运行一个OS线程,这非常好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM