2011-12-22 15 views
9

Quando si crea un'istanza di una classe, tutte le variabili in quell'istanza sono specifiche dell'istanza e vengono eliminate quando l'istanza non è inclusa nell'ambito. Ma come funziona in un metodo statico? Supponiamo che due persone chiamino System.Math.Abs ​​() esattamente alla stessa ora. In che modo il tempo di esecuzione differenzia tra i due chiamanti? È qui che entra in gioco la filettatura? I thread separati vengono creati automaticamente per ogni chiamante?Cosa succede quando si chiama un metodo statico in C#?

+1

Does [this] (http://stackoverflow.com/questions/680546/static-function-concurrency-asp-net) risponde alla tua domanda? –

+4

.ToString non è un metodo statico. –

+0

Emmanuel, ho controllato il post che hai menzionato. Riguarda la mia preoccupazione, ma non posso rispondere :( – developer747

risposta

10

Non esiste alcuna differenza tra i metodi statici e quelli non statici in termini di durata variabile del metodo. In entrambi i casi, come dettaglio di implementazione, i locals sono tipicamente (non proprio sempre: ci sono eccezioni) allocati nello stack. Lo stack è per-thread, quindi le variabili di metodo locali non eseguono il crossover tra i thread.

L'unica differenza qui tra istanza e statica è che i metodi di istanza hanno un parametro zeroth implicita, alias "questo", che viene spinto dal chiamante (più qualche spedizione virtuale e nulla-check divertente).

Per semplicità, io sto passando sopra blocchi iteratore, variabili catturati, ecc

+0

Grazie Marc! – developer747

6

Tutti i membri statici di una classe esistono anche se non esistono istanze della classe. Vengono inizializzati prima del primo utilizzo e vengono ripuliti quando il programma è completo.

Se due chiamate simultanee a un metodo statico, avrebbero funzionato con la stessa copia di tutti i membri statici della classe (se li utilizzano). Quindi, se il metodo statico funziona su un membro statico (o parametro), dovrebbe farlo in modo thread-safe. Se il metodo statico funziona solo sui locali, il metodo stesso è in genere thread-safe.

Per quanto riguarda il modo in cui il runtime distingue tra due chiamanti, questa è l'essenza del threading. Ogni thread ha il proprio stack di chiamate con la propria copia di eventuali variabili locali, parametri, indirizzo di ritorno, ecc. Quindi le due chiamate non vengono confuse e ciascuna restituisce correttamente il proprio chiamante. L'unica preoccupazione, ancora una volta, è se il metodo statico funziona su un membro statico che non è thread-safe (o un parametro che non è thread-safe).

+0

Buona spiegazione James. Grazie. Come fanno le persone a sapere cosa mi hai appena detto? Potresti raccomandare qualche buon libro, che affronta i fondamentali come questo? – developer747

+0

La maggior parte di questo ho imparato solo da il mio BS in corsi CompSci sulla programmazione della teoria del linguaggio e dallo studio autonomo dei linguaggi di programmazione.Se vuoi davvero entrare nei dettagli, leggi la specifica del linguaggio C#, ti dirà praticamente tutto ciò che c'è da sapere sull'implementazione: http: //msdn.microsoft.com/en-us/library/ms228593.aspx –

+0

Se dovessi raccomandare uno dei libri del tuo undergrad (che affronta aspetti fondamentali come questo) quale sarebbe? – developer747

12

Quando si crea un'istanza di una classe, tutte le variabili specifiche a tale istanza vengono uccisi quando l'istanza è fuori scopo.

Le variabili - di solito chiamati "campi" vengono deallocate dopo il vita dell'istanza. Scope è l'area del testo del programma in cui il compilatore riconosce qualcosa con il suo nome; liftime è la porzione di tempo durante cui un percorso di archiviazione è valido. Portata e durata sono spesso confusi.

Ma come funziona in un metodo statico?

I campi statici hanno una durata illimitata; il percorso di archiviazione viene creato in qualsiasi momento prima dell'accesso al campo e non viene eliminato fino a quando il dominio dell'app non viene rimosso.

Supponiamo che due persone chiamino System.Math.Abs ​​() esattamente alla stessa ora.

OK. Come proponi che ciò accada?

Come differenzia il tempo di esecuzione tra i due chiamanti? È qui che entra in gioco la filettatura?

Il metodo statico viene inserito in un gruppo di istruzioni della macchina che sono numeri in memoria. Ad ogni thread di esecuzione è associato un numero chiamato puntatore di istruzioni che individua l'istruzione corrente. Due thread diversi possono entrambi avere puntatori di istruzioni che si trovano nello stesso metodo statico nello stesso momento.

I thread separati vengono creati automaticamente per ogni chiamante?

La domanda non ha alcun senso. Come hai ottenuto due chiamanti allo stesso tempo se non erano già in thread separati?

Problemi correlati