Diferencia entre TVar y TMVar


He visto que el TVar es un contenedor simple, mientras que el TMVar es lo mismo que un MVar, lo que significa que tiene un candado, etc., pero dentro de la mónada STM. Me pregunto por qué sería necesario, ya que la idea del STM es hacer que las cerraduras sean innecesarias.

Entonces, ¿cuál es el que se debe usar si, por ejemplo, tiene un tipo como [Handle] una lista de controladores de socket que desea usar entre hilos hechos por forkIO?

Author: Lanbo, 2011-08-02

2 answers

No es realmente una cuestión de bloqueo, se trata de lo que significa la referencia:{[13]]}

  • TVar es una referencia mutable dentro de STM, que representa el estado compartido general. Lo creas sosteniendo un valor, puedes leerlo y escribirlo, etc. Es muy similar a IORef o STRef (que son lo mismo de todos modos).

  • TMVar es una referencia a una ranura que los hilos pueden usar para comunicarse. Se puede crear con un valor, o vacío. Usted puede poner un valor en él, que si ya se llena bloques hasta que alguien más lo vacía; o puede tomar un valor de él, que si ya se vacía bloques hasta que alguien lo llena. Obviamente es similar a un MVar, pero para muchos usos comunes podría ser más simple pensar en él como una cola de un solo elemento utilizada para un par productor/consumidor comunicante.

En resumen, TVar es un estado compartido general, úselo si desea actualizaciones atómicas de datos de lugares arbitrarios. TMVar es una sincronización primitiva, úsala si quieres un hilo para esperar hasta que algo esté disponible, mientras que otro espera que algo sea necesario.

También tenga en cuenta TChan, que se implementa aproximadamente como dos TVar s lugares de retención en una lista vinculada donde cada enlace hacia adelante es también un TVar, y funciona como una cola ilimitada para la comunicación.

Todos estos se pueden usar de maneras ligeramente diferentes,por supuesto you puede echar un vistazo al valor de un TMVar sin eliminarlo, por ejemplo, si desea un escenario donde múltiples hilos todos espere a que un solo recurso esté disponible, pero nunca es "utilizado".

 38
Author: C. A. McCann,
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
2011-08-02 16:20:59

Las diferencias entre TVar y TMVar no son tan grandes como parecen definitely definitivamente no son comparables a las diferencias entre IORef y MVar.

Mientras que MVar de hecho proporciona algún bloqueo para la seguridad del hilo, TMVar no hace nada interesante! (sin bloqueo adicional) Todo lo importante ya está implementado con STM y TVar, por lo que TMVar a es solo una abreviación para TVar (Maybe a) equipado con algunas funciones agradables (algunas de las cuales se bloquean usando la función retry).

Si el bloqueo con retry es compatible con el espíritu de STM y si elimina algunas de las ventajas del STM (sin bloqueos, etc.) es una pregunta separada y me encantaría ver a alguien más experimentado para responderla.

 19
Author: Rotsor,
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
2011-08-03 00:38:50