40

MVar は少しシンプルに見えますが、TVar はもう少し機能が豊富ですが、TVar は非常に使いやすいと思います。

だから私の質問は非常に単純です.TVarではなくMVarに行きたいのはどのような条件ですか? トランザクションの更新が必要ないときはいつでもMVar を使用できると思いますが、それはどのようなメリットがありますか?

4

2 に答える 2

43

MVar

  • 空にすることができます
  • スレッド間の同期パターンの実装に使用
  • スレッド間の一方向通信を許可する
  • TVar場合によってはより速くなる可能性があります

TVar

  • 空にすることはできません
  • アトミック トランザクション
  • スレッド間の「共有メモリ」。たとえば、複数のスレッドが読み書きできるルックアップキャッシュを実装するために使用できます
  • アクセスは、トランザクション ログ内の操作数の線形時間です。
  • 実行時間の長いトランザクションは、短いトランザクションが多数ある場合、飢餓に対して脆弱であり、正常にコミットできません。

IORef

  • 可変ポインターのような参照
  • IO破壊的な書き込み/更新によく使用される
  • 不可分な CAS 操作がありますが、複雑なトランザクション ロジックは、TVar

MVarまたは をいつ使用するかについて、厳格なルールはありませんTVar。私が保護しているリソースが「行方不明」になる場合 (空ではなく、Nothingvsを考慮してくださいJust mempty) は、MVar多くの場合最も理にかなっています。リソースへの変更のアトミック ブロックを実行する必要がある場合は、TVar最適です。

于 2013-03-15T19:06:11.200 に答える
41

TVar はより安全ですが、速度は遅くなります。

MVar はデッドロックする可能性がありますが、はるかに効率的です。

より効率的なのはIORefand atomicModifyIORef(CAS) ですが、それでできることは非常に限られています。

これは、実際には安全性とパフォーマンスのトレードオフです。TVar は完全に一般的で、非常に安全です。他のすべてはそうではなく、減少しています。

于 2013-03-15T19:00:34.363 に答える