Haskell STM 并重试
Haskell STM and retry
当我们 运行 一个命中 retry
的 STM
表达式时,线程被阻塞,如果条目被修改,事务将再次 运行。
但我想知道:
如果我们读取一个 STM 变量,但在导致重试的特定分支中实际未使用该变量,更新它是否会尝试再次执行事务?
虽然线程被阻塞了,但它真的被阻塞了吗?还是在线程池中回收以供其他可能等待的操作使用?
回复。 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 线程,这完全没问题。
当我们 运行 一个命中 retry
的 STM
表达式时,线程被阻塞,如果条目被修改,事务将再次 运行。
但我想知道:
如果我们读取一个 STM 变量,但在导致重试的特定分支中实际未使用该变量,更新它是否会尝试再次执行事务?
虽然线程被阻塞了,但它真的被阻塞了吗?还是在线程池中回收以供其他可能等待的操作使用?
回复。 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 线程,这完全没问题。