[英]Haskell STM and retry
当我们运行一个命中retry
的STM
表达式时,线程被阻塞,如果修改了条目,则再次运行该事务。
但我想知道:
如果我们读取一个STM变量,该变量在导致重试的特定分支中实际上没有使用,那么更新它会尝试再次执行该事务吗?
线程被阻止时,它是否真的被阻止了? 或者它是否在线程池中回收以供其他可能等待的操作使用?
回覆。 1:据我了解你的问题,是的,这是正确的; 您的整个STM事务将具有一致的世界视图, 包括由orElse
组成的orElse
(请参阅: https : orElse
)。 但我不确定你的意思是“但我的交易实际上取决于只有1个变量的价值”; 如果您执行readTVar
,则将跟踪对该var的更改。
回覆。 2:您可以将绿色线程视为已保存计算状态的块状物,这些块状物存储在类似堆栈的物体中并弹出,运行一段时间,并在它们暂时无法进一步进展时放回到堆栈中(“阻止”)或在他们跑了足够长的时间之后。 并行发生的程度取决于您告诉运行时使用的OS线程数(通过+RTS -N
)。 你可以有一个使用数千个绿色线程的并发程序,但只能运行一个OS线程,这非常好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.