2011-12-22 25 views
9

Cuando crea una instancia de una clase, todas las variables en esa instancia son específicas de esa instancia y mueren cuando la instancia está fuera del alcance. Pero, ¿cómo funciona en un método estático? Supongamos que dos personas llaman a System.Math.Abs ​​() exactamente al mismo tiempo. ¿Cómo se diferencia el tiempo de ejecución entre las dos personas que llaman? ¿Es aquí donde entra la rosca? ¿Se crean automáticamente hilos separados para cada persona que llama?¿Qué sucede cuando llamas a un método estático en C#?

+1

¿[este] (http://stackoverflow.com/questions/680546/static-function-concurrency-asp-net) responde a su pregunta? –

+4

.ToString no es un método estático. –

+0

Emmanuel, revisé la publicación que mencionaste. Se dirige a mi preocupación, pero no la respondo :( – developer747

Respuesta

10

No existe una diferencia real entre los métodos estáticos y no estáticos en términos de duración de la variable de método. En ambos casos, como un detalle de implementación, los locales son típicamente (no del todo: hay excepciones) asignados en la pila. La pila es por subproceso, por lo que las variables de método locales no se cruzan entre subprocesos.

La única diferencia aquí entre instancia y estática es que los métodos de instancia tienen un parámetro de orden cero implícita, también conocido como "presente", que es empujado por la persona que llama (además de algunos de despacho virtual y divertido nula-check).

Por simplicidad, estoy pasando por alto los bloques de iterador, variables capturadas, etc.

+0

Gracias Marc! – developer747

6

Todos los miembros estáticos de una clase existen aunque no existan instancias de la clase. Se inicializan en algún momento antes del primer uso y se limpian cuando se completa el programa.

Si tenía dos llamadas simultáneas a un método estático, estarían trabajando con la misma copia de los miembros estáticos de la clase (si los usan). Por lo tanto, si el método estático opera en un miembro estático (o parámetro), debe hacerlo de una manera segura. Si el método estático solo funciona en locales, entonces el método en sí mismo es típicamente seguro para subprocesos.

En cuanto a cómo diferencia el tiempo de ejecución entre dos llamadas, esta es la esencia del enhebrado. Cada hilo tiene su propia pila de llamadas con su propia copia de cualquier variable local, parámetros, dirección de retorno, etc. Por lo tanto, las dos llamadas no se confunden y cada una regresa a su llamador correctamente. La única preocupación, nuevamente, es si el método estático opera en un miembro estático que no es seguro para subprocesos (o un parámetro que no es seguro para subprocesos).

+0

Buena explicación James. Gracias. ¿Cómo sabe la gente lo que me acaba de decir? ¿Podría recomendar algún buen libro que aborde los fundamentos de este tipo? – developer747

+0

La mayoría de esto lo aprendí solo de mi licenciatura en cursos de CompSci sobre teoría del lenguaje de programación y autoaprendizaje de lenguajes de programación. Si realmente quiere profundizar en los detalles, lea la Especificación del lenguaje C#, le dirá todo lo que hay que saber sobre la implementación: http: //msdn.microsoft.com/en-us/library/ms228593.aspx –

+0

Si tuviera que recomendar uno de los libros de su licenciatura (que se refiere a fundamentos como este) ¿qué sería? – developer747

12

Cuando se crea una instancia de una clase, todas las variables específicas a esa instancia son asesinados cuando la instancia está fuera de alcance.

Las variables - usualmente llamados "campos" se cancela la asignación después de la vida de la instancia. El ámbito es la región del texto del programa en la que el compilador reconoce algo por su nombre; liftime es la parte del tiempo durante el cual una ubicación de almacenamiento es válida. El alcance y el tiempo de vida a menudo se confunden.

Pero, ¿cómo funciona en un método estático?

Los campos estáticos tienen vidas ilimitadas; la ubicación de almacenamiento se crea en algún momento antes de que se acceda al campo y no se destruya hasta que se rompa el dominio de aplicación.

Supongamos que dos personas llaman a System.Math.Abs ​​() exactamente al mismo tiempo.

OK. ¿Cómo propones que eso suceda?

¿Cómo diferencia el tiempo de ejecución entre las dos personas que llaman? ¿Es aquí donde entra la rosca?

El método estático se inserta en un conjunto de instrucciones de la máquina que son números en la memoria. Cada hilo de ejecución tiene un número asociado llamado puntero de instrucción que ubica la instrucción actual. Dos subprocesos diferentes pueden tener punteros de instrucción que están dentro del mismo método estático al mismo tiempo.

¿Se crean automáticamente hilos separados para cada llamante?

La pregunta no tiene ningún sentido. ¿Cómo obtuviste dos llamadas al mismo tiempo si no estaban ya en hilos separados?

Cuestiones relacionadas