何时/为什么在TVar上使用MVar

时间:2013-03-15 18:45:26

标签: haskell shared-memory stm

我发现TVar很容易使用,即使MVar看起来更简单一些,而TVar更有特色。

所以我的问题很简单,我想要什么条件去MVar而不是TVar?我想任何时候我都不需要交易更新我可以使用MVar,但这对我有什么好处?

2 个答案:

答案 0 :(得分:33)

TVars更安全但更慢。

MVars可以死锁,但效率更高。

效率更高仍然是IORefatomicModifyIORef(CAS),但是你可以用它做的事情受到严格限制。

这实际上是对性能权衡的安全性。 TVars非常通用,非常安全。其他一切都不那么重要了。

答案 1 :(得分:33)

<强> MVAR

  • 可以为空
  • 用于实现线程之间的同步模式
  • 允许线程之间的单向通信
  • 在某些情况下,
  • 可能比TVar更快

<强>的TVar

  • 可以为空
  • 原子交易
  • 线程之间的“共享内存”;可用于实现,例如,多个线程可以读/写的查找缓存
  • 访问权限是事务日志中操作数的线性时间
  • 如果有很多较短的交易,那么长时间运行的交易很容易遭受饥饿,从而阻止它们成功提交

<强> IOREF

  • 可变指针式参考
  • 经常用于破坏性IO写入/更新
  • 具有原子CAS操作,但复杂的事务逻辑更适合TVar

何时使用MVarTVar并没有真正的硬性规则。 如果我正在守卫的资源将“缺失”(而不是空,请考虑Nothing vs Just mempty),那么MVar通常最有意义。如果我需要对资源执行原子块修改,那么TVar是最合适的。