ci sono una serie di confusioni nel. le risposte qui, per lo più basate sulla non verità che le variabili locali sono allocate "nella pila del thread" è falso e irrilevante.
È falso perché la variabile locale può essere allocata su un pool temporaneo o sul pool di archiviazione a lungo termine; anche se è allocato su un pool temporaneo, non è necessario che sia la memoria di stack; potrebbe essere un registro. È irrilevante perché a chi importa di quale pool è allocato lo spazio di archiviazione?
Il fatto rilevante è che è allocata una variabile locale di primo livello per attivazione del metodo. Più in generale, una variabile locale in un blocco viene allocata una volta per ogni blocco inserito; una variabile locale dichiarata nel corpo di un ciclo, ad esempio, viene allocata ogni volta che il ciclo gira.
Quindi, prendiamo in considerazione la tua domanda:
Questo metodo può essere chiamato contemporaneamente da più thread.Se un thread è bloccato a DoStuffThatMightTakeAWhile e quindi un secondo thread chiama DoSomething con un argomento diverso, questo cambierà il valore di someVar per tutti i thread?
No. C'è un nuovo "someVar" per ogni attivazione di DoSomething.
esiste una qualcheVar per ogni thread?
Un "someVar" esisterà per ciascuna attivazione. Se un thread fa esattamente un'attivazione, allora ci sarà esattamente un qualche Var per thread; se un thread fa un milione di attivazioni, ce ne sarà un milione.
Detto questo, la risposta di Jon Hanna è anche corretto: se si effettua un delegato, che sia legge e scrive una variabile locale, e voi mano che delegato fuori per più thread, poi tutte le attivazioni del capitale delegato la stessa variabile locale. Non è stata creata per te alcuna sicurezza di thread magica; se vuoi farlo, sei responsabile della sicurezza del thread.
fonte
2011-12-20 17:08:51
Quindi, in poche parole, una dichiarazione come 'stringa myVar;' creerà __create__ un nuovo 'myVar', proprio come se stessi creando un oggetto con la parola chiave' new'? Questo vale anche per le chiamate ricorsive (se "DoSomething" chiamerebbe "DoSomething")? – Juan
@jsoldi: Il modo in cui l'allocatore di memoria crea nuovi locali e il modo in cui crea nuovo spazio per gli oggetti può essere molto diverso dietro le quinte, ma concettualmente sono la stessa cosa. E sì, le chiamate ricorsive sono * attivazioni * proprio come le chiamate non ricorsive. Ogni * attivazione * ottiene un nuovo lotto di locali. –
Perché si chiama "attivazione del metodo" e non "chiamata di metodo". È un termine speciale? – Restuta