multithreading haskell ioref

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!