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
?
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 deSTM
, que representa el estado compartido general. Lo creas sosteniendo un valor, puedes leerlo y escribirlo, etc. Es muy similar aIORef
oSTRef
(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 unMVar
, 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".
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.
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