Cuándo / por qué usar un MVar sobre un TVar
Me parece bastante fácil trabajar con TVar aunque MVar parece un poco más simple, mientras que TVar es un poco más característico.
Así que mi pregunta es bastante simple, ¿qué condición quiero ir a MVar en lugar de TVar? Supongo que cada vez que no necesito una actualización transaccional puedo usar un MVar, pero ¿de qué manera me beneficia eso?
2 answers
Las TVar son más seguras pero más lentas.
Los MVars pueden bloquearse, pero son mucho, mucho más eficientes.
Aún más eficiente es IORef
y atomicModifyIORef
(CAS), pero eso está muy restringido en lo que puede hacer con él.
Es realmente una seguridad sobre el rendimiento trade off. Los TVars son totalmente generales, muy seguros. Todo lo demás lo es menos, en una escala decreciente.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-15 19:00:34
MVar
- puede estar vacío
- se utiliza para implementar patrones de sincronización entre hilos
- permite la comunicación unidireccional entre hilos
- puede ser más rápido que
TVar
en algunos casos
TVar
- puede no {[9] } estar vacío
- transacciones atómicas
- "memoria compartida" entre subprocesos; se puede usar para implementar, por ejemplo, una caché de búsqueda desde la que se pueden lectura / escritura
- el acceso es el tiempo lineal en el número de operaciones en el diario de las transacciones
- las transacciones de larga duración son vulnerables a la inanición si hay muchas transacciones más cortas, lo que les impide comprometerse con éxito
IORef
- referencia tipo puntero mutable
- a menudo utilizado para destructivo
IO
escribe / actualiza - tiene operaciones CAS atómicas, pero la lógica transaccional compleja es más adecuada para un
TVar
No hay realmente una regla dura y rápida para cuándo usar MVar
vs TVar
, pero generalmente pienso en si mi contenedor estará "vacío" (MVar
). O tendré que realizar bloques atómicos de modificaciones a mi variable (TVar
)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-10 19:15:56