40

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

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

4

2 回答 2

43

MVar

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

电视柜

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

IORef

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

MVar对于何时使用or并没有真正的硬性规定TVar。如果我要保护的资源将永远“丢失”(而不是空的,考虑Nothingvs Just mempty),那么MVar通常是最有意义的。如果我需要对资源执行原子修改块,那么TVar是最合适的。

于 2013-03-15T19:06:11.200 回答
41

TVar 更安全但速度较慢。

MVar 可能会死锁,但效率要高得多。

更有效的仍然是IORefand atomicModifyIORef(CAS),但是你可以用它做什么受到了很大的限制。

这实际上是一种安全而不是性能的权衡。TVars是完全通用的,非常安全。其他一切都不那么重要,而且规模越来越小。

于 2013-03-15T19:00:34.363 回答