繁体   English   中英

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

[英]When/why use an MVar over a TVar

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

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

无功

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

的TVar

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

IOREF

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

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

电视更安全但速度更慢。

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

更高效的仍然是IORefatomicModifyIORef (CAS),但是你可以用它来做很多限制。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM