2012-06-28 8 views
6

Con Clojure (y otros dialectos de Lisp) puede modificar el código de ejecución. Entonces, cuando una función se modifica durante el tiempo de ejecución ¿ese cambio está disponible para múltiples hilos?¿Cómo se modifican las funciones en tiempo de ejecución y luego se propagan a varios subprocesos?

Estoy tratando de averiguar cómo funciona técnicamente en un entorno concurrente: si varios hilos están usando una función foo , lo que sucede cuando redefino (digamos usando defn) la función foo ?

Tiene que haber alguna sincronización en marcha: cuándo y cómo ocurre dicha sincronización y cuánto cuesta.

Decir en una JVM, ¿se hace referencia a la función utilizando una referencia volatile? Si es así, ¿significa que cada vez que hay una "función de búsqueda", entonces uno tiene que pagar el costo volatile?

Respuesta

8

En Clojure las funciones son instancias de la clase IFn y are almost always stored in vars. los vars son mecanismo de Clojures para enhebrar los valores locales.

  • cuando se define una función que establece la "raíz de enlace" de la variable para hacer referencia a la función
  • hilos de otros hilos consiguen cualquiera que sea el valor actual de la unión de la raíz var, pero no puede cambiar el valor. esto evita que dos hilos tengan que luchar por el valor de la var porque solo el hilo raíz puede establecer el valor.
  • Los subprocesos pueden elegir utilizar un nuevo valor de la var si es necesario, pero llamando al binding que les da su propio valor de subproceso local que son libres de cambiar a voluntad porque ningún otro subproceso puede leerlo.

Una buena comprensión de los vars bien vale la pena estudiar un poco, son un dispositivo de concurrencia muy útil una vez que se acostumbre a ellos.

ps: el hilo de la raíz suele ser el pss REPL : usted es por supuesto libre para almacenar sus funciones en algo distinto de VARs, si por ejemplo se necesitaba para actualizar atómicamente un grupo de funciones, aunque esto es raro.

+0

+1 y gracias por ser siempre tan útil con respecto a Clojure (y otros temas;) ¿Su primer punto es una oración o donde los dos primeros puntos se fusionaron en un solo párrafo? Creo que quisiste escribir algo un poco diferente:) –

+0

Planeo aprenderlo todo, pero el camino es un poco largo;) –

+0

@cedric Martin, voy a dar ese paso a través de la máquina de gramática ... ;-) –

Cuestiones relacionadas