2012-08-16 15 views
5

Esta es una pregunta teórica motivada por mi deseo de comprender mejor la concurrencia de Clojure.¿Deberían leerse múltiples refs de Clojure en una transacción por consistencia?

Digamos que estoy escribiendo boids. Supongamos que cada boid es un hilo verde separado que muta posiciones en un vector o refs que representa una rejilla mundial. Piensa en la colonia de hormigas de Hickey.

Ahora, la documentación en Clojure.org indica que "Todas las lecturas de Refs verán una instantánea consistente del 'mundo Ref' a partir del punto de inicio de la transacción (su 'punto de lectura')".

¿Esto significa que sólo se puede obtener una imagen coherente de mi simulación, por ejemplo, para dibujar, mediante la lectura de mi vector de referencias dentro de una transacción (es decir, dentro de un contexto dosync?)

Gracias!

Respuesta

6

Necesita una transacción si desea una instantánea coherente.

Si lee las referencias fuera de una transacción, obtendrá un valor instantáneo en el momento en que las lea. No tiene garantía de que otra transacción no cambie uno o más de los refs entre sus lecturas, por lo que podría terminar con una vista incoherente.

Cuestiones relacionadas