2012-06-28 7 views
6

Con Clojure (e altri dialoghi Lisp) è possibile modificare il codice in esecuzione. Quindi, quando una funzione viene modificata durante il runtime, tale modifica è resa disponibile a più thread?Come vengono modificate le funzioni in fase di esecuzione e quindi propagate su più thread?

sto cercando di capire come funziona tecnicamente in un ambiente concorrente: se più fili utilizzano una funzione foo, cosa succede quando ridefinire (dire utilizzando defn) la funzione foo?

Deve esserci qualche sincronizzazione in corso: quando e come si verifica tale sincronizzazione e quanto costa?

Dire su una JVM, la funzione è referenziata utilizzando un riferimento volatile? In tal caso, significa che ogni volta c'è una "ricerca di funzione", quindi è necessario pagare il costo di volatile?

risposta

8

In Clojure le funzioni sono istanze della classe IFn e sono are almost always stored in vars. vars è il meccanismo Clojures per i valori locali di thread .

  • quando si definisce una funzione che imposta il della var fare riferimento alla funzione
  • fili altri fili ottengono qualunque sia il valore corrente della rilegatura per la radice var ma non può cambiare il "binding radice" valore. questo impedisce a due thread di dover combattere sul valore di var perché solo il thread di root può impostare il valore.
  • thread possono scegliere di utilizzare un nuovo valore di var se necessario, ma chiamando binding che fornisce quindi il proprio valore di thread locale che sono liberi di cambiare a volontà perché nessun altro thread può leggerlo.

Una buona conoscenza di vars vale bene un piccolo studio, sono un dispositivo di concorrenza molto utile una volta che ci si abitua a loro.

ps: il filo principale è di solito il PSS REPL : siete ovviamente liberi di memorizzare le funzioni in qualcosa di diverso da Vars, se per esempio avete bisogno di aggiornare atomicamente un gruppo di funzioni, anche se questo è raro.

+0

+1 e grazie per essere sempre stato così utile per quanto riguarda Clojure (e altri argomenti;) Il tuo primo punto è una frase o dove i due primi punti dovrebbero essere uniti in un paragrafo? Penso che volevi scrivere qualcosa di diverso:) –

+0

Ho intenzione di imparare tutto, ma la strada è piuttosto lunga;) –

+0

@cedric Martin, passerò quell'altro passaggio attraverso la grammatica ... ;-) –

Problemi correlati