Haskell STM并重试
当我们运行一个retry
的STM
表达式时,线程被阻塞,并且如果条目被修改,则事务再次运行。
但我想知道:
如果我们读取一个STM变量,它在那个导致重试的特定分支中没有被实际使用,它会更新它尝试再次执行事务吗?
线程被阻塞时,它是否真的被阻塞? 还是在线程池中回收以供其他潜在的等待操作使用?
回覆。 1:根据我的理解你的问题,是的,这是正确的; 您的整个STM交易将具有一致的世界观,包括与orElse
组成的orElse
(请参阅:https: orElse
)。 但我不确定你的意思,“但我的交易实际上取决于只有一个变量的价值”; 如果你做了一个readTVar
那么对这个var的更改将被跟踪。
回覆。 2:你可以将绿色线程看作是保存的计算状态的块,它们存储在类似堆栈的东西中,然后弹出,运行一段时间,并在他们无法进一步取得进展时放回堆栈(“封锁”)或足够长的时间后。 并发发生的程度取决于您告诉运行时使用的操作系统线程的数量(通过+RTS -N
)。 你可以有一个使用数千个绿色线程的并发程序,但只能在一个操作系统线程中运行,这很好。