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?

Author: Jimmy Hoffa, 2013-03-15

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.

 31
Author: Don Stewart,
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)

 31
Author: cdk,
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