Haskell STM并重试

nic*_*las 2 multithreading haskell stm

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

但我想知道:

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

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

sch*_*kin 6

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