2012-12-05 11 views
5

Per esempio, metodi come:I metodi della classe Ruby sono thread-safe?

class MyClass 
    self.perform(id) 
    hash = doSomething(id) 
    doMoreStuff(hash) 
    return hash 
    end 
end 

La mia preoccupazione è se ho più thread di chiamata MyClass.perform(). L'oggetto hash potrebbe essere potenzialmente sovrascritto da un altro thread? In altre parole, Thread 1 chiama doSomething e ottiene un hash restituito di {1 => 1}. Ma subito dopo Thread 2 chiama doSomething e ottiene un hash di {2 => 2}. Che succede ora? L'hash del Thread 1 cambia in {2 => 2}?

Oppure ogni thread funziona da solo hash che non può mai essere toccato da altri thread? Si supponga che doSomething e doMoreStuff siano già thread-safe.

Se è importante, sto usando Rails 3.0.

+0

Per quanto ne so, con le guide, ad esempio, non sono – macool

+0

Puoi spiegare quali sono le preoccupazioni relative alla sicurezza dei thread riguardo al metodo? –

+1

Inoltre, non c'è bisogno di 'return' alla fine del metodo. Se hai solo "hash" sull'ultima riga, questo sarà il valore di ritorno. –

risposta

16

Le variabili locali, ad esempio hash, sono locali per la particolare chiamata del metodo circostante. Se due thread terminano chiamando allo stesso tempo perform, ciascuna chiamata otterrà il proprio contesto di esecuzione e quelli non si sovrappongono a meno che non siano coinvolte risorse condivise: variabili di istanza(), variabili di classe (@@hash), globali ($hash) , ... può causare problemi di concorrenza. Non c'è niente di cui preoccuparsi a livello di thread con qualcosa di semplice come il tuo perform.

Tuttavia, se perform stava creando thread e si è finito con le chiusure all'interno di perform, allora si potrebbe finire con diversi thread che fanno riferimento alle stesse variabili locali catturate attraverso le chiusure. Quindi devi stare attento ai problemi di ambito quando crei i thread, ma non devi preoccuparti di questo quando si tratta di metodi semplici che funzionano solo con variabili locali.

1

Qualcosa che è un "metodo di classe" (che è solo un metodo Singleton su un oggetto di classe) non lo rende più sicuro per i thread di quanto non sia un metodo di istanza.

+1

@Downvoter quando la risposta è stata scritta, la domanda era davvero vaga, e non potrei fornire molte più informazioni di questa. Sto ancora cercando di chiarire cosa sta chiedendo l'OP, quindi per favore non sottovalutare questa risposta. –

Problemi correlati