multithreading - ¿Cuál es la diferencia entre un IORef y un MVar?
haskell (1)
MVar
está, como usted dijo, dirigido a subprocesos IORef
mientras que IORef
puede usarse como variable mutable en un programa de un solo hilo o como una construcción de sincronización en un programa de multiproceso.
IORef
puede usarse junto con atomicModifyIORef
para obtener el atomicModifyIORef
de comparación e intercambio (CAS): los escritores y los lectores pueden sincronizarse en un solo valor puro, almacenado en el IORef
. Los lectores usan readIORef
para leer un valor y los escritores usan atomicModifyIORef
para escribir un valor. Tenga en cuenta que atomicModifyIORef
no permite que los escritores realicen ningún efecto secundario dentro de la sección crítica (es decir, solo pueden usar una función pura cuando se cambia el valor de forma atómica).
MVar
permite implementar secciones críticas arbitrarias (usando withMVar
), que pueden contener efectos secundarios. También se pueden usar como un IORef
(como se describe en el párrafo anterior), pero a un costo mayor.
Si desea una intuición para el tipo de semántico que IORef
implementa, es lo mismo que la semántica CAS que Rich Hickey describe en una charla sobre el modelo de concurrencia de Clojure: http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey
Edición: Además, no puede encontrarse con interbloqueos utilizando IORef
(pero todavía puede haber contención, lo que provoca reintentos).
Me está costando entender la diferencia básica entre el tipo IORef y el tipo MVar en Haskell. ¿Alguien me puede ayudar con esto? Parecen resolver el mismo problema. MVar parece estar dirigido a multiproceso, pero IORef tiene la función atomicModifyIORef.
¡Gracias!