Domanda

Ho un'app altamente multithread scritta in Ruby che condivide alcune variabili di istanza. Le scritture su queste variabili sono rare (1%) mentre le letture sono molto comuni (99%). Qual è il modo migliore (secondo te o nella maniera idiomatica di Ruby) per garantire che questi thread vedano sempre i valori più aggiornati coinvolti? Ecco alcune idee finora che ho avuto ( anche se mi piacerebbe il tuo contributo prima di revisionarlo):

  • Avere un lucchetto che verrà maggiormente utilizzato prima di leggere o scrivere una di queste variabili (da Concorrenza Java in pratica ). Il rovescio della medaglia di questo è che inserisce molti blocchi sincronizzare nel mio codice e non vedo un modo semplice per evitarlo.
  • Usa il metodo freeze di Ruby (vedi qui ), sebbene sembra ugualmente ingombrante e non mi offre alcun vantaggio di sincronizzazione offerto dalla prima opzione.

Queste opzioni sembrano entrambe abbastanza simili, ma speriamo che chiunque abbia un'idea migliore (o possa discutere bene per una di queste idee). Andrei anche bene a rendere immutabili gli oggetti in modo che non siano corrotti o alterati nel mezzo di un'operazione, ma non conosco Ruby abbastanza bene da effettuare la chiamata da solo e questa domanda sembra sostenere che gli oggetti sono altamente mutabili.

È stato utile?

Soluzione

L'uso del blocco è il modo più appropriato per farlo. Puoi vedere questa presentazione di Jim Weirich sull'argomento: Ciò che tutti i rubyisti dovrebbero sapere sul threading .

Inoltre, il congelamento di un oggetto non ti aiuterà qui poiché desideri modificare queste variabili. Congelandoli sul posto significa che non saranno applicabili ulteriori modifiche a questi (e quindi il tuo 1% di scritture non funzionerà).

Altri suggerimenti

Non l'ho usato da solo, ma potresti voler dare un'occhiata a Flusso di dati . Fa scrivere tutte le variabili una volta.

Il blocco lettori-scrittore è un problema comune con una soluzione ben definita:

Blocco lettori-scrittore

e ci sono molte implementazioni di esso:

Pattern di blocco della scrittura

Non vuoi mettere un lucchetto su ogni lettura / scrittura

Devi usare un Mutex per sincronizzare l'accesso allo stato condiviso. Non c'è davvero modo di evitare di farlo.

Sui moderni computer multi-core non è possibile fare ipotesi su come si accederà alla memoria o su come gli accessi alla memoria interagiranno con la memorizzazione nella cache.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top