В чем разница между 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
(но все еще может быть раздор, вызывая повторные попытки).