19

HaskellのIORefタイプとMVarタイプの基本的な違いを理解するのに少し問題があります。誰かがこれを手伝ってくれますか?それらは同じ問題を解決するように見えます。MVarはマルチスレッドを対象としているようですが、IORefにはatomicModifyIORef関数があります。

ありがとう!

4

1 に答える 1

20

MVarあなたが言ったように、はマルチスレッドを対象としてIORefいますが、シングルスレッドプログラムでは可変変数として、またはマルチスレッドプログラムでは同期構造として使用できます。

IORefと一緒に使用してatomicModifyIORef、コンペアアンドスワップ(CAS)の動作を取得できます。ライターとリーダーは、に格納されている単一の純粋な値で同期できますIORef。リーダーreadIORefは値の読み取りに使用し、ライターはatomicModifyIORef値の書き込みに使用します。atomicModifyIORefライターがクリティカルセクション内で副作用を実行しないように注意してください(つまり、値をアトミックに変更する場合にのみ純粋関数を使用できます)。

MVarwithMVar副作用を含む可能性のある任意のクリティカルセクションを(を使用して)実装できます。これらはIORef(前の段落で説明したように)と同じように使用することもできますが、コストが高くなります。

どのようなセマンティクスが実装されているかを直感的に知りたい場合はIORef、Clojureの並行性モデルに関する講演でRich Hickeyが説明しているCASセマンティクスと同じです:http://www.infoq.com/presentations/Are-We-There-Yet-Rich -ヒッキー

編集:さらに、を使用してデッドロックに遭遇することはできませんIORef(ただし、競合が発生し、再試行が発生する可能性があります)。

于 2011-03-07T08:04:02.647 に答える