В чем разница между IORef и MVar?

У меня возникли небольшие проблемы с пониманием принципиальной разницы между типом IORef и типом MVar в Haskell. Может ли кто-нибудь помочь мне с этим? Похоже, они решают ту же проблему. MVar, кажется, нацелен на многопоточность, но IORef имеет функцию atomicModifyIORef.

Спасибо!

1 ответ

Решение

MVar как вы сказали, нацелена на многопоточность IORef может использоваться как изменяемая переменная в однопоточной программе или как конструкция синхронизации в многопоточной программе.

IORef можно использовать вместе с atomicModifyIORef чтобы получить поведение сравнения и замены (CAS): писатели и читатели могут синхронизироваться по одному чистому значению, хранящемуся в IORef, Читатели используют readIORef читать значение и использовать писателей atomicModifyIORef написать значение. Обратите внимание, что atomicModifyIORef не позволяет авторам выполнять какие-либо побочные эффекты внутри критической секции (то есть они могут использовать чистую функцию только при атомарном изменении значения).

MVar позволяет реализовать произвольные критические разделы (используя withMVar), которые могут содержать побочные эффекты. Они также могут быть использованы как IORef (как описано в предыдущем абзаце), но по более высокой цене.

Если вы хотите, чтобы интуиция для какой смысловой IORef реализует его так же, как семантика CAS, которую описывает Rich Hickey в докладе о модели параллелизма Clojure: http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey

Редактировать: Кроме того, вы не можете столкнуться с тупиками, используя IORef (но все еще может быть раздор, вызывая повторные попытки).

Другие вопросы по тегам